|
|
1.1 root 1: /*
2: * Mach Operating System
3: * Copyright (c) 1991,1990,1989 Carnegie Mellon University
4: * All Rights Reserved.
5: *
6: * Permission to use, copy, modify and distribute this software and its
7: * documentation is hereby granted, provided that both the copyright
8: * notice and this permission notice appear in all copies of the
9: * software, derivative works or modified versions, and any portions
10: * thereof, and that both notices appear in supporting documentation.
11: *
12: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
13: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
14: * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
15: *
16: * Carnegie Mellon requests users of this software to return to
17: *
18: * Software Distribution Coordinator or [email protected]
19: * School of Computer Science
20: * Carnegie Mellon University
21: * Pittsburgh PA 15213-3890
22: *
23: * any improvements or extensions that they make and grant Carnegie Mellon
24: * the rights to redistribute these changes.
25: */
26: /*
27: * File: bt431.c
28: * Author: Alessandro Forin, Carnegie Mellon University
29: * Date: 8/91
30: *
31: * Routines for the bt431 Cursor
32: */
33:
34: #include <platforms.h>
35:
36: #include <chips/bt431.h>
37: #include <chips/screen.h>
38:
39: #ifdef DECSTATION
40: /*
41: * This configuration uses two twin 431s
42: */
43: #define set_value(x) (((x)<<8)|((x)&0xff))
44: #define get_value(x) ((x)&0xff)
45:
46: typedef struct {
47: volatile unsigned short addr_lo;
48: short pad0;
49: volatile unsigned short addr_hi;
50: short pad1;
51: volatile unsigned short addr_cmap;
52: short pad2;
53: volatile unsigned short addr_reg;
54: short pad3;
55: } bt431_padded_regmap_t;
56:
57: #else /*DECSTATION*/
58:
59: #define set_value(x) x
60: #define get_value(x) x
61: typedef bt431_regmap_t bt431_padded_regmap_t;
62: #define wbflush()
63:
64: #endif /*DECSTATION*/
65:
66: /*
67: * Generic register access
68: */
69: void
70: bt431_select_reg( regs, regno)
71: bt431_padded_regmap_t *regs;
72: {
73: regs->addr_lo = set_value(regno&0xff);
74: regs->addr_hi = set_value((regno >> 8) & 0xff);
75: wbflush();
76: }
77:
78: void
79: bt431_write_reg( regs, regno, val)
80: bt431_padded_regmap_t *regs;
81: {
82: bt431_select_reg( regs, regno );
83: regs->addr_reg = set_value(val);
84: wbflush();
85: }
86:
87: unsigned char
88: bt431_read_reg( regs, regno)
89: bt431_padded_regmap_t *regs;
90: {
91: bt431_select_reg( regs, regno );
92: return get_value(regs->addr_reg);
93: }
94:
95: /* when using autoincrement */
96: #define bt431_write_reg_autoi( regs, regno, val) \
97: { \
98: (regs)->addr_reg = set_value(val); \
99: wbflush(); \
100: }
101: #define bt431_read_reg_autoi( regs, regno) \
102: get_value(((regs)->addr_reg))
103:
104: #define bt431_write_cmap_autoi( regs, regno, val) \
105: { \
106: (regs)->addr_cmap = (val); \
107: wbflush(); \
108: }
109: #define bt431_read_cmap_autoi( regs, regno) \
110: ((regs)->addr_cmap)
111:
112:
113: /*
114: * Cursor ops
115: */
116: bt431_cursor_on(regs)
117: bt431_padded_regmap_t *regs;
118: {
119: bt431_write_reg( regs, BT431_REG_CMD,
120: BT431_CMD_CURS_ENABLE|BT431_CMD_OR_CURSORS|
121: BT431_CMD_4_1_MUX|BT431_CMD_THICK_1);
122: }
123:
124: bt431_cursor_off(regs)
125: bt431_padded_regmap_t *regs;
126: {
127: bt431_write_reg( regs, BT431_REG_CMD, BT431_CMD_4_1_MUX);
128: }
129:
130: bt431_pos_cursor(regs,x,y)
131: bt431_padded_regmap_t *regs;
132: register int x,y;
133: {
134: #define lo(v) ((v)&0xff)
135: #define hi(v) (((v)&0xf00)>>8)
136:
137: /*
138: * Cx = x + D + H - P
139: * P = 37 if 1:1, 52 if 4:1, 57 if 5:1
140: * D = pixel skew between outdata and external data
141: * H = pixels between HSYNCH falling and active video
142: *
143: * Cy = y + V - 32
144: * V = scanlines between HSYNCH falling, two or more
145: * clocks after VSYNCH falling, and active video
146: */
147:
148: bt431_write_reg( regs, BT431_REG_CXLO, lo(x + 360));
149: /* use autoincr feature */
150: bt431_write_reg_autoi( regs, BT431_REG_CXHI, hi(x + 360));
151: bt431_write_reg_autoi( regs, BT431_REG_CYLO, lo(y + 36));
152: bt431_write_reg_autoi( regs, BT431_REG_CYHI, hi(y + 36));
153: }
154:
155:
156: bt431_cursor_sprite( regs, cursor)
157: bt431_padded_regmap_t *regs;
158: register unsigned short *cursor;
159: {
160: register int i;
161:
162: bt431_select_reg( regs, BT431_REG_CRAM_BASE+0);
163: for (i = 0; i < 512; i++)
164: bt431_write_cmap_autoi( regs, BT431_REG_CRAM_BASE+i, *cursor++);
165: }
166:
167: #if 1
168: bt431_print_cursor(regs)
169: bt431_padded_regmap_t *regs;
170: {
171: unsigned short curs[512];
172: register int i;
173:
174: bt431_select_reg( regs, BT431_REG_CRAM_BASE+0);
175: for (i = 0; i < 512; i++) {
176: curs[i] = bt431_read_cmap_autoi( regs, BT431_REG_CRAM_BASE+i);
177: }
178: for (i = 0; i < 512; i += 16)
179: printf("%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n",
180: curs[i], curs[i+1], curs[i+2], curs[i+3],
181: curs[i+4], curs[i+5], curs[i+6], curs[i+7],
182: curs[i+8], curs[i+9], curs[i+10], curs[i+11],
183: curs[i+12], curs[i+13], curs[i+14], curs[i+15]);
184: }
185:
186: #endif
187:
188: /*
189: * Initialization
190: */
191: unsigned /*char*/short bt431_default_cursor[64*8] = {
192: 0xffff, 0, 0, 0, 0, 0, 0, 0,
193: 0xffff, 0, 0, 0, 0, 0, 0, 0,
194: 0xffff, 0, 0, 0, 0, 0, 0, 0,
195: 0xffff, 0, 0, 0, 0, 0, 0, 0,
196: 0xffff, 0, 0, 0, 0, 0, 0, 0,
197: 0xffff, 0, 0, 0, 0, 0, 0, 0,
198: 0xffff, 0, 0, 0, 0, 0, 0, 0,
199: 0xffff, 0, 0, 0, 0, 0, 0, 0,
200: 0xffff, 0, 0, 0, 0, 0, 0, 0,
201: 0xffff, 0, 0, 0, 0, 0, 0, 0,
202: 0xffff, 0, 0, 0, 0, 0, 0, 0,
203: 0xffff, 0, 0, 0, 0, 0, 0, 0,
204: 0xffff, 0, 0, 0, 0, 0, 0, 0,
205: 0xffff, 0, 0, 0, 0, 0, 0, 0,
206: 0xffff, 0, 0, 0, 0, 0, 0, 0,
207: 0xffff, 0, 0, 0, 0, 0, 0, 0,
208: 0,
209: };
210:
211: bt431_init(regs)
212: bt431_padded_regmap_t *regs;
213: {
214: register int i;
215:
216: /* use 4:1 input mux */
217: bt431_write_reg( regs, BT431_REG_CMD,
218: BT431_CMD_CURS_ENABLE|BT431_CMD_OR_CURSORS|
219: BT431_CMD_4_1_MUX|BT431_CMD_THICK_1);
220:
221: /* home cursor */
222: bt431_write_reg_autoi( regs, BT431_REG_CXLO, 0x00);
223: bt431_write_reg_autoi( regs, BT431_REG_CXHI, 0x00);
224: bt431_write_reg_autoi( regs, BT431_REG_CYLO, 0x00);
225: bt431_write_reg_autoi( regs, BT431_REG_CYHI, 0x00);
226:
227: /* no crosshair window */
228: bt431_write_reg_autoi( regs, BT431_REG_WXLO, 0x00);
229: bt431_write_reg_autoi( regs, BT431_REG_WXHI, 0x00);
230: bt431_write_reg_autoi( regs, BT431_REG_WYLO, 0x00);
231: bt431_write_reg_autoi( regs, BT431_REG_WYHI, 0x00);
232: bt431_write_reg_autoi( regs, BT431_REG_WWLO, 0x00);
233: bt431_write_reg_autoi( regs, BT431_REG_WWHI, 0x00);
234: bt431_write_reg_autoi( regs, BT431_REG_WHLO, 0x00);
235: bt431_write_reg_autoi( regs, BT431_REG_WHHI, 0x00);
236:
237: /* load default cursor */
238: bt431_cursor_sprite( regs, bt431_default_cursor);
239: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.