Annotation of sys/dev/ic/bt463.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: bt463.c,v 1.10 2002/11/09 22:51:48 miod Exp $ */
2: /* $NetBSD: bt463.c,v 1.2 2000/06/13 17:21:06 nathanw Exp $ */
3:
4: /*-
5: * Copyright (c) 1998 The NetBSD Foundation, Inc.
6: * All rights reserved.
7: *
8: * This code is derived from software contributed to The NetBSD Foundation
9: * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
10: * NASA Ames Research Center.
11: *
12: * Redistribution and use in source and binary forms, with or without
13: * modification, are permitted provided that the following conditions
14: * are met:
15: * 1. Redistributions of source code must retain the above copyright
16: * notice, this list of conditions and the following disclaimer.
17: * 2. Redistributions in binary form must reproduce the above copyright
18: * notice, this list of conditions and the following disclaimer in the
19: * documentation and/or other materials provided with the distribution.
20: * 3. All advertising materials mentioning features or use of this software
21: * must display the following acknowledgement:
22: * This product includes software developed by the NetBSD
23: * Foundation, Inc. and its contributors.
24: * 4. Neither the name of The NetBSD Foundation nor the names of its
25: * contributors may be used to endorse or promote products derived
26: * from this software without specific prior written permission.
27: *
28: * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
29: * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
30: * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
31: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
32: * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
33: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
34: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
35: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
36: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
37: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
38: * POSSIBILITY OF SUCH DAMAGE.
39: */
40:
41: /*
42: * Copyright (c) 1995, 1996 Carnegie-Mellon University.
43: * All rights reserved.
44: *
45: * Author: Chris G. Demetriou
46: *
47: * Permission to use, copy, modify and distribute this software and
48: * its documentation is hereby granted, provided that both the copyright
49: * notice and this permission notice appear in all copies of the
50: * software, derivative works or modified versions, and any portions
51: * thereof, and that both notices appear in supporting documentation.
52: *
53: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
54: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
55: * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
56: *
57: * Carnegie Mellon requests users of this software to return to
58: *
59: * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
60: * School of Computer Science
61: * Carnegie Mellon University
62: * Pittsburgh PA 15213-3890
63: *
64: * any improvements or extensions that they make and grant Carnegie the
65: * rights to redistribute these changes.
66: */
67:
68: /* This code was derived from and originally located in sys/dev/pci/
69: * NetBSD: tga_bt463.c,v 1.5 2000/03/04 10:27:59 elric Exp
70: */
71:
72: #include <sys/param.h>
73: #include <sys/systm.h>
74: #include <sys/device.h>
75: #include <sys/buf.h>
76: #include <sys/kernel.h>
77: #include <sys/malloc.h>
78:
79: #include <uvm/uvm_extern.h>
80:
81: #include <dev/pci/pcivar.h>
82: #include <dev/pci/tgareg.h>
83: #include <dev/pci/tgavar.h>
84: #include <dev/ic/bt463reg.h>
85: #include <dev/ic/bt463var.h>
86:
87: #include <dev/wscons/wsconsio.h>
88:
89: /*
90: * Functions exported via the RAMDAC configuration table.
91: */
92: void bt463_init(struct ramdac_cookie *);
93: int bt463_set_cmap(struct ramdac_cookie *,
94: struct wsdisplay_cmap *);
95: int bt463_get_cmap(struct ramdac_cookie *,
96: struct wsdisplay_cmap *);
97: int bt463_set_cursor(struct ramdac_cookie *,
98: struct wsdisplay_cursor *);
99: int bt463_get_cursor(struct ramdac_cookie *,
100: struct wsdisplay_cursor *);
101: int bt463_set_curpos(struct ramdac_cookie *,
102: struct wsdisplay_curpos *);
103: int bt463_get_curpos(struct ramdac_cookie *,
104: struct wsdisplay_curpos *);
105: int bt463_get_curmax(struct ramdac_cookie *,
106: struct wsdisplay_curpos *);
107: int bt463_check_curcmap(struct ramdac_cookie *,
108: struct wsdisplay_cursor *cursorp);
109: void bt463_set_curcmap(struct ramdac_cookie *,
110: struct wsdisplay_cursor *cursorp);
111: int bt463_get_curcmap(struct ramdac_cookie *,
112: struct wsdisplay_cursor *cursorp);
113:
114: #ifdef BT463_DEBUG
115: int bt463_store(void *);
116: int bt463_debug(void *);
117: int bt463_readback(void *);
118: void bt463_copyback(void *);
119: #endif
120:
121: struct ramdac_funcs bt463_funcsstruct = {
122: "Bt463",
123: bt463_register,
124: bt463_init,
125: bt463_set_cmap,
126: bt463_get_cmap,
127: bt463_set_cursor,
128: bt463_get_cursor,
129: bt463_set_curpos,
130: bt463_get_curpos,
131: bt463_get_curmax,
132: bt463_check_curcmap,
133: bt463_set_curcmap,
134: bt463_get_curcmap,
135: NULL,
136: };
137:
138: /*
139: * Private data.
140: */
141: struct bt463data {
142: void *cookie; /* This is what is passed
143: * around, and is probably
144: * struct tga_devconfig *
145: */
146:
147: int (*ramdac_sched_update)(void *, void (*)(void *));
148: void (*ramdac_wr)(void *, u_int, u_int8_t);
149: u_int8_t (*ramdac_rd)(void *, u_int);
150:
151: int changed; /* what changed; see below */
152: char curcmap_r[2]; /* cursor colormap */
153: char curcmap_g[2];
154: char curcmap_b[2];
155: char cmap_r[BT463_NCMAP_ENTRIES]; /* colormap */
156: char cmap_g[BT463_NCMAP_ENTRIES];
157: char cmap_b[BT463_NCMAP_ENTRIES];
158: int window_type[16]; /* 16 24-bit window type table entries */
159: };
160:
161: /* When we're doing console initialization, there's no
162: * way to get our cookie back to the video card's softc
163: * before we call sched_update. So we stash it here,
164: * and bt463_update will look for it here first.
165: */
166: static struct bt463data *console_data;
167:
168:
169: #define BTWREG(data, addr, val) do { bt463_wraddr((data), (addr)); \
170: (data)->ramdac_wr((data)->cookie, BT463_REG_IREG_DATA, (val)); } while (0)
171: #define BTWNREG(data, val) (data)->ramdac_wr((data)->cookie, \
172: BT463_REG_IREG_DATA, (val))
173: #define BTRREG(data, addr) (bt463_wraddr((data), (addr)), \
174: (data)->ramdac_rd((data)->cookie, BT463_REG_IREG_DATA))
175: #define BTRNREG(data) ((data)->ramdac_rd((data)->cookie, BT463_REG_IREG_DATA))
176:
177: #define DATA_CURCMAP_CHANGED 0x01 /* cursor colormap changed */
178: #define DATA_CMAP_CHANGED 0x02 /* colormap changed */
179: #define DATA_WTYPE_CHANGED 0x04 /* window type table changed */
180: #define DATA_ALL_CHANGED 0x07
181:
182: /*
183: * Internal functions.
184: */
185: inline void bt463_wraddr(struct bt463data *, u_int16_t);
186:
187: void bt463_update(void *);
188:
189:
190: /*****************************************************************************/
191:
192: /*
193: * Functions exported via the RAMDAC configuration table.
194: */
195:
196: struct ramdac_funcs *
197: bt463_funcs(void)
198: {
199: return &bt463_funcsstruct;
200: }
201:
202: struct ramdac_cookie *
203: bt463_register(v, sched_update, wr, rd)
204: void *v;
205: int (*sched_update)(void *, void (*)(void *));
206: void (*wr)(void *, u_int, u_int8_t);
207: u_int8_t (*rd)(void *, u_int);
208: {
209: struct bt463data *data;
210: /*
211: * XXX -- comment out of date. rcd.
212: * If we should allocate a new private info struct, do so.
213: * Otherwise, use the one we have (if it's there), or
214: * use the temporary one on the stack.
215: */
216: data = malloc(sizeof *data, M_DEVBUF, M_WAITOK);
217: /* XXX -- if !data */
218: data->cookie = v;
219: data->ramdac_sched_update = sched_update;
220: data->ramdac_wr = wr;
221: data->ramdac_rd = rd;
222: return (struct ramdac_cookie *)data;
223: }
224:
225: /*
226: * This function exists solely to provide a means to init
227: * the RAMDAC without first registering. It is useful for
228: * initializing the console early on.
229: */
230: void
231: bt463_cninit(v, sched_update, wr, rd)
232: void *v;
233: int (*sched_update)(void *, void (*)(void *));
234: void (*wr)(void *, u_int, u_int8_t);
235: u_int8_t (*rd)(void *, u_int);
236: {
237: struct bt463data tmp, *data = &tmp;
238: data->cookie = v;
239: data->ramdac_sched_update = sched_update;
240: data->ramdac_wr = wr;
241: data->ramdac_rd = rd;
242: /* Set up console_data so that when bt463_update is called back,
243: * it can use the right information.
244: */
245: console_data = data;
246: bt463_init((struct ramdac_cookie *)data);
247: console_data = NULL;
248: }
249:
250: void
251: bt463_init(rc)
252: struct ramdac_cookie *rc;
253: {
254: struct bt463data *data = (struct bt463data *)rc;
255:
256: int i;
257:
258: /*
259: * Init the BT463 for normal operation.
260: */
261:
262:
263: /*
264: * Setup:
265: * reg 0: 4:1 multiplexing, 25/75 blink.
266: * reg 1: Overlay mapping: mapped to common palette,
267: * 14 window type entries, 24-plane configuration mode,
268: * 4 overlay planes, underlays disabled, no cursor.
269: * reg 2: sync-on-green enabled, pedestal enabled.
270: */
271:
272: BTWREG(data, BT463_IREG_COMMAND_0, 0x40);
273: BTWREG(data, BT463_IREG_COMMAND_1, 0x48);
274: BTWREG(data, BT463_IREG_COMMAND_2, 0xC0);
275:
276: /*
277: * Initialize the read mask.
278: */
279: bt463_wraddr(data, BT463_IREG_READ_MASK_P0_P7);
280: for (i = 0; i < 4; i++)
281: BTWNREG(data, 0xff);
282:
283: /*
284: * Initialize the blink mask.
285: */
286: bt463_wraddr(data, BT463_IREG_BLINK_MASK_P0_P7);
287: for (i = 0; i < 4; i++)
288: BTWNREG(data, 0);
289:
290:
291: /*
292: * Clear test register
293: */
294: BTWREG(data, BT463_IREG_TEST, 0);
295:
296: /*
297: * Initalize the RAMDAC info struct to hold all of our
298: * data, and fill it in.
299: */
300: data->changed = DATA_ALL_CHANGED;
301:
302: /* initial cursor colormap: 0 is black, 1 is white */
303: data->curcmap_r[0] = data->curcmap_g[0] = data->curcmap_b[0] = 0;
304: data->curcmap_r[1] = data->curcmap_g[1] = data->curcmap_b[1] = 0xff;
305:
306: /* Initial colormap: 0 is black, everything else is white */
307: data->cmap_r[0] = data->cmap_g[0] = data->cmap_b[0] = 0;
308: for (i = 1; i < 256; i++) {
309: data->cmap_r[i] = rasops_cmap[3*i + 0];
310: data->cmap_g[i] = rasops_cmap[3*i + 1];
311: data->cmap_b[i] = rasops_cmap[3*i + 2];
312: }
313:
314: /* Initialize the window type table:
315: *
316: * Entry 0: 24-plane truecolor, overlays enabled, bypassed.
317: *
318: * Lookup table bypass: yes ( 1 << 23 & 0x800000) 800000
319: * Colormap address: 0x000 (0x000 << 17 & 0x7e0000) 0
320: * Overlay mask: 0xf ( 0xf << 13 & 0x01e000) 1e000
321: * Overlay location: P<27:24> ( 0 << 12 & 0x001000) 0
322: * Display mode: Truecolor ( 0 << 9 & 0x000e00) 000
323: * Number of planes: 8 ( 8 << 5 & 0x0001e0) 100
324: * Plane shift: 0 ( 0 << 0 & 0x00001f) 0
325: * --------
326: * 0x81e100
327: */
328: data->window_type[0] = 0x81e100;
329:
330: /* Entry 1: 8-plane pseudocolor in the bottom 8 bits,
331: * overlays enabled, colormap starting at 0.
332: *
333: * Lookup table bypass: no ( 0 << 23 & 0x800000) 0
334: * Colormap address: 0x000 (0x000 << 17 & 0x7e0000) 0
335: * Overlay mask: 0xf ( 0xf << 13 & 0x01e000) 0x1e000
336: * Overlay location: P<27:24> ( 0 << 12 & 0x001000) 0
337: * Display mode: Pseudocolor ( 1 << 9 & 0x000e00) 0x200
338: * Number of planes: 8 ( 8 << 5 & 0x0001e0) 0x100
339: * Plane shift: 16 ( 0x10 << 0 & 0x00001f) 10
340: * --------
341: * 0x01e310
342: */
343: data->window_type[1] = 0x01e310;
344:
345: /* The colormap interface to the world only supports one colormap,
346: * so having an entry for the 'alternate' colormap in the bt463
347: * probably isn't useful.
348: */
349:
350: /* Fill the remaining table entries with clones of entry 0 until we
351: * figure out a better use for them.
352: */
353:
354: for (i = 2; i < BT463_NWTYPE_ENTRIES; i++) {
355: data->window_type[i] = 0x81e100;
356: }
357:
358: data->ramdac_sched_update(data->cookie, bt463_update);
359:
360: }
361:
362: int
363: bt463_set_cmap(rc, cmapp)
364: struct ramdac_cookie *rc;
365: struct wsdisplay_cmap *cmapp;
366: {
367: struct bt463data *data = (struct bt463data *)rc;
368: u_int count, index;
369: int s, error;
370:
371: index = cmapp->index;
372: count = cmapp->count;
373:
374: if (index >= BT463_NCMAP_ENTRIES || count > BT463_NCMAP_ENTRIES - index)
375: return (EINVAL);
376:
377: s = spltty();
378:
379: if ((error = copyin(cmapp->red, &data->cmap_r[index], count)) != 0) {
380: splx(s);
381: return (error);
382: }
383: if ((error = copyin(cmapp->green, &data->cmap_g[index], count)) != 0) {
384: splx(s);
385: return (error);
386: }
387: if ((error = copyin(cmapp->blue, &data->cmap_b[index], count)) != 0) {
388: splx(s);
389: return (error);
390: }
391:
392: data->changed |= DATA_CMAP_CHANGED;
393:
394: data->ramdac_sched_update(data->cookie, bt463_update);
395: splx(s);
396:
397: return (0);
398: }
399:
400: int
401: bt463_get_cmap(rc, cmapp)
402: struct ramdac_cookie *rc;
403: struct wsdisplay_cmap *cmapp;
404: {
405: struct bt463data *data = (struct bt463data *)rc;
406: u_int count, index;
407: int error;
408:
409: count = cmapp->count;
410: index = cmapp->index;
411:
412: if (index >= BT463_NCMAP_ENTRIES || count > BT463_NCMAP_ENTRIES - index)
413: return (EINVAL);
414:
415: error = copyout(&data->cmap_r[index], cmapp->red, count);
416: if (error)
417: return (error);
418: error = copyout(&data->cmap_g[index], cmapp->green, count);
419: if (error)
420: return (error);
421: error = copyout(&data->cmap_b[index], cmapp->blue, count);
422: return (error);
423: }
424:
425: int
426: bt463_check_curcmap(rc, cursorp)
427: struct ramdac_cookie *rc;
428: struct wsdisplay_cursor *cursorp;
429: {
430: u_int index, count;
431: u_int8_t spare[2];
432: int error;
433:
434: index = cursorp->cmap.index;
435: count = cursorp->cmap.count;
436:
437: if (index >= 2 || count > 2 - index)
438: return (EINVAL);
439:
440: if ((error = copyin(&cursorp->cmap.red, &spare, count)) != 0)
441: return (error);
442: if ((error = copyin(&cursorp->cmap.green, &spare, count)) != 0)
443: return (error);
444: if ((error = copyin(&cursorp->cmap.blue, &spare, count)) != 0)
445: return (error);
446:
447: return (0);
448: }
449:
450: void
451: bt463_set_curcmap(rc, cursorp)
452: struct ramdac_cookie *rc;
453: struct wsdisplay_cursor *cursorp;
454: {
455: struct bt463data *data = (struct bt463data *)rc;
456: int count, index;
457:
458: /* can't fail; parameters have already been checked. */
459: count = cursorp->cmap.count;
460: index = cursorp->cmap.index;
461: copyin(cursorp->cmap.red, &data->curcmap_r[index], count);
462: copyin(cursorp->cmap.green, &data->curcmap_g[index], count);
463: copyin(cursorp->cmap.blue, &data->curcmap_b[index], count);
464: data->changed |= DATA_CURCMAP_CHANGED;
465: data->ramdac_sched_update(data->cookie, bt463_update);
466: }
467:
468: int
469: bt463_get_curcmap(rc, cursorp)
470: struct ramdac_cookie *rc;
471: struct wsdisplay_cursor *cursorp;
472: {
473: struct bt463data *data = (struct bt463data *)rc;
474: int error;
475:
476: cursorp->cmap.index = 0; /* DOCMAP */
477: cursorp->cmap.count = 2;
478: if (cursorp->cmap.red != NULL) {
479: error = copyout(data->curcmap_r, cursorp->cmap.red, 2);
480: if (error)
481: return (error);
482: }
483: if (cursorp->cmap.green != NULL) {
484: error = copyout(data->curcmap_g, cursorp->cmap.green, 2);
485: if (error)
486: return (error);
487: }
488: if (cursorp->cmap.blue != NULL) {
489: error = copyout(data->curcmap_b, cursorp->cmap.blue, 2);
490: if (error)
491: return (error);
492: }
493: return (0);
494: }
495:
496:
497: /*****************************************************************************/
498:
499: /*
500: * Internal functions.
501: */
502:
503: #ifdef BT463_DEBUG
504: int bt463_store(void *v)
505: {
506: struct bt463data *data = (struct bt463data *)v;
507:
508: data->changed = DATA_ALL_CHANGED;
509: data->ramdac_sched_update(data->cookie, bt463_update);
510: printf("Scheduled bt463 store\n");
511:
512: return 0;
513: }
514:
515:
516: int bt463_readback(void *v)
517: {
518: struct bt463data *data = (struct bt463data *)v;
519:
520: data->ramdac_sched_update(data->cookie, bt463_copyback);
521: printf("Scheduled bt463 copyback\n");
522: return 0;
523: }
524:
525: int
526: bt463_debug(v)
527: void *v;
528: {
529: struct bt463data *data = (struct bt463data *)v;
530: int i;
531: u_int8_t val;
532:
533: printf("BT463 main regs:\n");
534: for (i = 0x200; i < 0x20F; i ++) {
535: val = BTRREG(data, i);
536: printf(" $%04x %02x\n", i, val);
537: }
538:
539: printf("BT463 revision register:\n");
540: val = BTRREG(data, 0x220);
541: printf(" $%04x %02x\n", 0x220, val);
542:
543: printf("BT463 window type table (from softc):\n");
544:
545: for (i = 0; i < BT463_NWTYPE_ENTRIES; i++) {
546: printf("%02x %06x\n", i, data->window_type[i]);
547: }
548:
549: return 0;
550: }
551:
552: void
553: bt463_copyback(p)
554: void *p;
555: {
556: struct bt463data *data = (struct bt463data *)p;
557: int i;
558:
559: for (i = 0; i < BT463_NWTYPE_ENTRIES; i++) {
560: bt463_wraddr(data, BT463_IREG_WINDOW_TYPE_TABLE + i);
561: data->window_type[i] = (BTRNREG(data) & 0xff); /* B0-7 */
562: data->window_type[i] |= (BTRNREG(data) & 0xff) << 8; /* B8-15 */
563: data->window_type[i] |= (BTRNREG(data) & 0xff) << 16; /* B16-23 */
564: }
565: }
566: #endif
567:
568: inline void
569: bt463_wraddr(data, ireg)
570: struct bt463data *data;
571: u_int16_t ireg;
572: {
573: data->ramdac_wr(data->cookie, BT463_REG_ADDR_LOW, ireg & 0xff);
574: data->ramdac_wr(data->cookie, BT463_REG_ADDR_HIGH, (ireg >> 8) & 0xff);
575: }
576:
577: void
578: bt463_update(p)
579: void *p;
580: {
581: struct bt463data *data = (struct bt463data *)p;
582: int i, v;
583:
584: if (console_data != NULL) {
585: /* The cookie passed in from sched_update is incorrect. Use the
586: * right one.
587: */
588: data = console_data;
589: }
590:
591: v = data->changed;
592:
593: /* The Bt463 won't accept window type data except during a blanking
594: * interval, so we do this early in the interrupt.
595: * Blanking the screen might also be a good idea, but it can cause
596: * unpleasant flashing and is hard to do from this side of the
597: * ramdac interface.
598: */
599: if (v & DATA_WTYPE_CHANGED) {
600: /* spit out the window type data */
601: for (i = 0; i < BT463_NWTYPE_ENTRIES; i++) {
602: bt463_wraddr(data, BT463_IREG_WINDOW_TYPE_TABLE + i);
603: BTWNREG(data, (data->window_type[i]) & 0xff); /* B0-7 */
604: BTWNREG(data, (data->window_type[i] >> 8) & 0xff); /* B8-15 */
605: BTWNREG(data, (data->window_type[i] >> 16) & 0xff); /* B16-23 */
606: }
607: }
608:
609: if (v & DATA_CURCMAP_CHANGED) {
610: bt463_wraddr(data, BT463_IREG_CURSOR_COLOR_0);
611: /* spit out the cursor data */
612: for (i = 0; i < 2; i++) {
613: BTWNREG(data, data->curcmap_r[i]);
614: BTWNREG(data, data->curcmap_g[i]);
615: BTWNREG(data, data->curcmap_b[i]);
616: }
617: }
618:
619: if (v & DATA_CMAP_CHANGED) {
620: bt463_wraddr(data, BT463_IREG_CPALETTE_RAM);
621: /* spit out the colormap data */
622: for (i = 0; i < BT463_NCMAP_ENTRIES; i++) {
623: data->ramdac_wr(data->cookie, BT463_REG_CMAP_DATA,
624: data->cmap_r[i]);
625: data->ramdac_wr(data->cookie, BT463_REG_CMAP_DATA,
626: data->cmap_g[i]);
627: data->ramdac_wr(data->cookie, BT463_REG_CMAP_DATA,
628: data->cmap_b[i]);
629: }
630: }
631:
632: data->changed = 0;
633: }
634:
635: int bt463_set_cursor (rc, cur)
636: struct ramdac_cookie *rc;
637: struct wsdisplay_cursor *cur;
638: {
639: struct bt463data *data = (struct bt463data *)rc;
640: return tga_builtin_set_cursor(data->cookie, cur);
641: }
642:
643: int bt463_get_cursor (rc, cur)
644: struct ramdac_cookie *rc;
645: struct wsdisplay_cursor *cur;
646: {
647: struct bt463data *data = (struct bt463data *)rc;
648: return tga_builtin_get_cursor(data->cookie, cur);
649: }
650:
651: int bt463_set_curpos (rc, cur)
652: struct ramdac_cookie *rc;
653: struct wsdisplay_curpos *cur;
654: {
655: struct bt463data *data = (struct bt463data *)rc;
656: return tga_builtin_set_curpos(data->cookie, cur);
657: }
658:
659: int bt463_get_curpos (rc, cur)
660: struct ramdac_cookie *rc;
661: struct wsdisplay_curpos *cur;
662: {
663: struct bt463data *data = (struct bt463data *)rc;
664: return tga_builtin_get_curpos(data->cookie, cur);
665: }
666:
667: int bt463_get_curmax (rc, cur)
668: struct ramdac_cookie *rc;
669: struct wsdisplay_curpos *cur;
670: {
671: struct bt463data *data = (struct bt463data *)rc;
672: return tga_builtin_get_curmax(data->cookie, cur);
673: }
CVSweb