grf_rhreg.h revision 1.3 1 1.3 chopps /* $NetBSD: grf_rhreg.h,v 1.3 1994/12/01 17:25:07 chopps Exp $ */
2 1.1 chopps
3 1.1 chopps #ifndef _GRF_RHREG_H
4 1.1 chopps #define _GRF_RHREG_H
5 1.1 chopps
6 1.1 chopps /*
7 1.1 chopps * Written & Copyright by Lutz Vieweg. As for missing comments: see
8 1.1 chopps * grf_rt.*
9 1.1 chopps *
10 1.1 chopps * Lutz provided these sources in C++, I tried to keep as much of it when
11 1.1 chopps * converting to C. -mw-
12 1.1 chopps */
13 1.1 chopps
14 1.1 chopps #define EMPTY_ALPHA 0x2010 /* this is the char and the attribute
15 1.1 chopps that AlphaErase will fill into the
16 1.1 chopps text-screen */
17 1.1 chopps
18 1.1 chopps #define MEMCLK 65000000 /* this is the memory clock value, you shouldn't
19 1.1 chopps set it to less than 65000000, higher values may
20 1.1 chopps speed up blits a little bit, if you raise this
21 1.1 chopps value too much, some trash will appear on your
22 1.1 chopps screen. */
23 1.1 chopps
24 1.1 chopps #define MEMSIZE 4 /* Set this to 1 or 4 (MB), according to the
25 1.1 chopps RAM on your Retina BLT Z3 board */
26 1.1 chopps /*
27 1.1 chopps * The following definitions are places in the frame-buffer memory
28 1.1 chopps * which are used for special purposes. While the displayed screen
29 1.1 chopps * itself is always beginning at the start of the frame-buffer
30 1.1 chopps * memory, the following special places are located at the end
31 1.1 chopps * of the memory to keep free as much space as possible for the
32 1.1 chopps * screen - the user might want to use monitor-definitions with
33 1.1 chopps * huge logical dimensions (e.g. 2048x2000 ?). This way of defining
34 1.1 chopps * special locations in the frame-buffer memory is far from being
35 1.1 chopps * elegant - you may want to use you own, real memory-management...
36 1.1 chopps * but remember that some routines in RZ3_BSD.cc REALLY NEED those
37 1.1 chopps * memory locations to function properly, so if you manage the
38 1.1 chopps * frame-buffer memory on your own, make sure to change those
39 1.1 chopps * definitions appropriately.
40 1.1 chopps */
41 1.1 chopps
42 1.1 chopps /* reserve some space for one pattern line */
43 1.1 chopps #define PAT_MEM_SIZE 16*3
44 1.1 chopps #define PAT_MEM_OFF (MEMSIZE*1024*1024 - PAT_MEM_SIZE)
45 1.1 chopps
46 1.1 chopps /* reserve some space for the hardware cursor (up to 64x64 pixels) */
47 1.1 chopps #define HWC_MEM_SIZE 1024
48 1.1 chopps #define HWC_MEM_OFF ((PAT_MEM_OFF - HWC_MEM_SIZE) & 0xffffff00)
49 1.1 chopps
50 1.1 chopps /*
51 1.1 chopps * The following structure is passed to RZ3Init() and holds the
52 1.1 chopps * monitor-definition. You may either use one of the ready-made
53 1.1 chopps * definitions in RZ3_monitors.cc or you can define them on your
54 1.1 chopps * own, take a look at RZ3_monitors.cc for more information.
55 1.1 chopps */
56 1.1 chopps struct MonDef {
57 1.1 chopps
58 1.1 chopps /* first the general monitor characteristics */
59 1.1 chopps
60 1.1 chopps unsigned long FQ;
61 1.1 chopps unsigned char FLG;
62 1.1 chopps
63 1.1 chopps unsigned short MW; /* physical screen width in pixels */
64 1.1 chopps /* has to be at least a multiple of 8 */
65 1.1 chopps unsigned short MH; /* physical screen height in pixels */
66 1.1 chopps
67 1.1 chopps unsigned short HBS;
68 1.1 chopps unsigned short HSS;
69 1.1 chopps unsigned short HSE;
70 1.1 chopps unsigned short HBE;
71 1.1 chopps unsigned short HT;
72 1.1 chopps unsigned short VBS;
73 1.1 chopps unsigned short VSS;
74 1.1 chopps unsigned short VSE;
75 1.1 chopps unsigned short VBE;
76 1.1 chopps unsigned short VT;
77 1.1 chopps
78 1.1 chopps unsigned short DEP; /* Color-depth, 4 enables text-mode */
79 1.1 chopps /* 8 enables 256-color graphics-mode, */
80 1.1 chopps /* 16 and 24bit gfx not supported yet */
81 1.1 chopps
82 1.1 chopps unsigned char * PAL; /* points to 16*3 byte RGB-palette data */
83 1.1 chopps /* use LoadPalette() to set colors 0..255 */
84 1.1 chopps /* in 256-color-gfx mode */
85 1.1 chopps
86 1.1 chopps /*
87 1.1 chopps * all following entries are font-specific in
88 1.1 chopps * text-mode. Make sure your monitor
89 1.1 chopps * parameters are calculated for the
90 1.1 chopps * appropriate font width and height!
91 1.1 chopps */
92 1.1 chopps
93 1.1 chopps unsigned short TX; /* Text-mode (DEP=4): */
94 1.1 chopps /* screen-width in characters */
95 1.1 chopps
96 1.1 chopps /* Gfx-mode (DEP > 4) */
97 1.1 chopps /* "logical" screen-width, */
98 1.1 chopps /* use values > MW to allow */
99 1.1 chopps /* hardware-panning */
100 1.1 chopps
101 1.1 chopps unsigned short TY; /* Text-mode: */
102 1.1 chopps /* screen-height in characters */
103 1.1 chopps
104 1.1 chopps /* Gfx-mode: "logical" screen */
105 1.1 chopps /* height for panning */
106 1.1 chopps
107 1.1 chopps /* the following values are currently unused for gfx-mode */
108 1.1 chopps
109 1.1 chopps unsigned short XY; /* TX*TY (speeds up some calcs.) */
110 1.1 chopps
111 1.1 chopps unsigned short FX; /* font-width (valid values: 4,7-16) */
112 1.1 chopps unsigned short FY; /* font-height (valid range: 1-32) */
113 1.1 chopps unsigned char * FData; /* pointer to the font-data */
114 1.1 chopps
115 1.1 chopps /*
116 1.1 chopps * The font data is simply an array of bytes defining
117 1.1 chopps * the chars in ascending order, line by line. If your
118 1.1 chopps * font is wider than 8 pixel, FData has to be an
119 1.1 chopps * array of words.
120 1.1 chopps */
121 1.1 chopps
122 1.1 chopps unsigned short FLo; /* lowest character defined */
123 1.1 chopps unsigned short FHi; /* highest char. defined */
124 1.1 chopps
125 1.1 chopps };
126 1.1 chopps
127 1.1 chopps
128 1.1 chopps /*
129 1.1 chopps * The following are the prototypes for the low-level
130 1.1 chopps * routines you may want to call.
131 1.1 chopps */
132 1.1 chopps
133 1.1 chopps #if 0
134 1.1 chopps
135 1.1 chopps #ifdef __GNUG__
136 1.1 chopps
137 1.1 chopps /* The prototypes for C++, prototypes for C (with explanations) below */
138 1.1 chopps
139 1.1 chopps "C" unsigned char * RZ3Init (volatile void * HardWareAdress, struct MonDef * md);
140 1.1 chopps "C" void RZ3SetCursorPos (unsigned short pos);
141 1.1 chopps "C" void RZ3AlphaErase (unsigned short xd, unsigned short yd,
142 1.1 chopps unsigned short w, unsigned short h );
143 1.1 chopps "C" void RZ3AlphaCopy (unsigned short xs, unsigned short ys,
144 1.1 chopps unsigned short xd, unsigned short yd,
145 1.1 chopps unsigned short w, unsigned short h );
146 1.1 chopps "C" void RZ3BitBlit (struct grf_bitblt * gbb );
147 1.1 chopps "C" void RZ3BitBlit16 (struct grf_bitblt * gbb );
148 1.1 chopps "C" void RZ3LoadPalette (unsigned char * pal, unsigned char firstcol, unsigned char colors);
149 1.1 chopps "C" void RZ3SetPalette (unsigned char colornum, unsigned char red, unsigned char green, unsigned char blue);
150 1.1 chopps "C" void RZ3SetPanning (unsigned short xoff, unsigned short yoff);
151 1.1 chopps "C" void RZ3SetupHWC (unsigned char col1, unsigned col2,
152 1.1 chopps unsigned char hsx, unsigned char hsy,
153 1.1 chopps const unsigned long * data);
154 1.1 chopps "C" void RZ3DisableHWC (void);
155 1.1 chopps "C" void RZ3SetHWCloc (unsigned short x, unsigned short y);
156 1.1 chopps #else
157 1.1 chopps
158 1.1 chopps /* The prototypes for C */
159 1.1 chopps /* with a little explanation */
160 1.1 chopps
161 1.1 chopps unsigned char * RZ3Init(volatile void * BoardAdress, struct MonDef * md);
162 1.1 chopps
163 1.1 chopps /*
164 1.1 chopps * This routine initialises the Retina Z3 hardware, opens a
165 1.1 chopps * text- or gfx-mode screen, depending on the the value of
166 1.1 chopps * MonDef.DEP, and sets the cursor to position 0.
167 1.1 chopps * It takes as arguments a pointer to the hardware-base
168 1.1 chopps * address as it is denoted in the DevConf structure
169 1.1 chopps * of the AmigaDOS, and a pointer to a struct MonDef
170 1.1 chopps * which describes the screen-mode parameters.
171 1.1 chopps *
172 1.1 chopps * The routine returns 0 if it was unable to open the screen,
173 1.1 chopps * or an unsigned char * to the display memory when it
174 1.1 chopps * succeeded.
175 1.1 chopps *
176 1.1 chopps * The organisation of the display memory in text-mode is a
177 1.1 chopps * little strange (Intel-typically...) :
178 1.1 chopps *
179 1.1 chopps * Byte 00 01 02 03 04 05 06 etc.
180 1.1 chopps * Char0 Attr0 -- -- Char1 Attr1 -- etc.
181 1.1 chopps *
182 1.1 chopps * You may set a character and its associated attribute byte
183 1.1 chopps * with a single word-access, or you may perform to byte writes
184 1.1 chopps * for the char and attribute. Each 2. word has no meaning,
185 1.1 chopps * and writes to theese locations are ignored.
186 1.1 chopps *
187 1.1 chopps * The attribute byte for each character has the following
188 1.1 chopps * structure:
189 1.1 chopps *
190 1.1 chopps * Bit 7 6 5 4 3 2 1 0
191 1.1 chopps * BLINK BACK2 BACK1 BACK0 FORE3 FORE2 FORE1 FORE0
192 1.1 chopps *
193 1.1 chopps * Were FORE is the foreground-color index (0-15) and
194 1.1 chopps * BACK is the background color index (0-7). BLINK
195 1.1 chopps * enables blinking for the associated character.
196 1.1 chopps * The higher 8 colors in the standard palette are
197 1.1 chopps * lighter than the lower 8, so you may see FORE3 as
198 1.1 chopps * an intensity bit. If FORE == 1 or FORE == 9 and
199 1.1 chopps * BACK == 0 the character is underlined. Since I don't
200 1.1 chopps * think this looks good, it will probably change in a
201 1.1 chopps * future release.
202 1.1 chopps *
203 1.1 chopps * There's no routine "SetChar" or "SetAttr" provided,
204 1.1 chopps * because I think it's so trivial... a function call
205 1.1 chopps * would be pure overhead. As an example, a routine
206 1.1 chopps * to set the char code and attribute at position x,y:
207 1.1 chopps * (assumed the value returned by RZ3Init was stored
208 1.1 chopps * into "DispMem", the actual MonDef struct * is hold
209 1.1 chopps * in "MDef")
210 1.1 chopps *
211 1.1 chopps * void SetChar(unsigned char chr, unsigned char attr,
212 1.1 chopps * unsigned short x, unsigned short y) {
213 1.1 chopps *
214 1.1 chopps * unsigned struct MonDef * md = MDef;
215 1.1 chopps * unsigned char * c = DispMem + x*4 + y*md->TX*4;
216 1.1 chopps *
217 1.1 chopps * *c++ = chr;
218 1.1 chopps * *c = attr;
219 1.1 chopps *
220 1.1 chopps * }
221 1.1 chopps *
222 1.1 chopps * In gfx-mode, the memory organisation is rather simple,
223 1.1 chopps * 1 byte per pixel in 256-color mode, one pixel after
224 1.1 chopps * each other, line by line.
225 1.1 chopps *
226 1.1 chopps * When 16-bits per pixel are used, each two bytes represent
227 1.1 chopps * one pixel. The meaning of the bits is the following:
228 1.1 chopps *
229 1.1 chopps * Bit 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
230 1.1 chopps * Component g2 g1 g0 b4 b3 b2 b1 b0 r4 r3 r2 r1 r0 g5 g4 g3
231 1.1 chopps *
232 1.1 chopps * Please note that the memory layout in gfx-mode depends
233 1.1 chopps * on the logical screen-size, panning does only affect
234 1.1 chopps * the appearance of the physical screen.
235 1.1 chopps *
236 1.1 chopps * Currently, RZ3Init() disables the Retina Z3 VBLANK IRQ,
237 1.1 chopps * but beware: When running the Retina WB-Emu under
238 1.1 chopps * AmigaDOS, the VBLANK IRQ is ENABLED...
239 1.1 chopps *
240 1.1 chopps */
241 1.1 chopps
242 1.1 chopps void RZ3LoadPalette(unsigned char * pal, unsigned char firstcol, unsigned char colors);
243 1.1 chopps
244 1.1 chopps /*
245 1.1 chopps * Loads the palette-registers. "pal" points to an array of unsigned char
246 1.1 chopps * triplets, for the red, green and blue component. "firstcol" determines the
247 1.1 chopps * number of the first palette-register to load (256 available). "colors" is
248 1.1 chopps * the number of colors you want to put in the palette registers.
249 1.1 chopps */
250 1.1 chopps
251 1.1 chopps void RZ3SetPalette(unsigned char colornum, unsigned char red, unsigned char green, unsigned char blue);
252 1.1 chopps
253 1.1 chopps /*
254 1.1 chopps * Allows you to set a single color in the palette, "colornum" is the number
255 1.1 chopps * of the palette entry (256 available), "red", "green" and "blue" are the
256 1.1 chopps * three components.
257 1.1 chopps */
258 1.1 chopps
259 1.1 chopps void RZ3SetCursorPos(unsigned short pos);
260 1.1 chopps
261 1.1 chopps /*
262 1.1 chopps * This routine sets the text-mode hardware-cursor position to the screen
263 1.1 chopps * location pos. pos can be calculated as (x + y * md->TY).
264 1.1 chopps * Text-mode only!
265 1.1 chopps */
266 1.1 chopps
267 1.1 chopps void RZ3AlphaCopy (unsigned short xs, unsigned short ys,
268 1.1 chopps unsigned short xd, unsigned short yd,
269 1.1 chopps unsigned short w, unsigned short h );
270 1.1 chopps
271 1.1 chopps /*
272 1.1 chopps * This Routine utilizes the blitter to perform fast copies
273 1.1 chopps * in the text-display. The paramters are:
274 1.1 chopps * xs - source x-coordinate
275 1.1 chopps * ys - source y-coordinate
276 1.1 chopps * xd - destination x-coordinate
277 1.1 chopps * yd - destination y-coordinate
278 1.1 chopps * w - the width of the area to copy
279 1.1 chopps * h - the height of the area to copy
280 1.1 chopps * All coordinates are in characters. RZ3AlphaCopy does not
281 1.1 chopps * check for boundaries - you've got to make sure that the
282 1.1 chopps * parameters have sensible values. Text-mode only!
283 1.1 chopps */
284 1.1 chopps
285 1.1 chopps
286 1.1 chopps void RZ3AlphaErase (unsigned short xd, unsigned short yd,
287 1.1 chopps unsigned short w, unsigned short h );
288 1.1 chopps
289 1.1 chopps /*
290 1.1 chopps * RZ3AlphaErase utilizes the blitter to erase portions of
291 1.1 chopps * the text-display. The parameters are:
292 1.1 chopps * xd - destination x-coordinate
293 1.1 chopps * yd - destination y-coordinate
294 1.1 chopps * w - the width of the area to erase
295 1.1 chopps * h - the height of the area to erase
296 1.1 chopps * All coordinates are in characters. RZ3AlphaCopy does not
297 1.1 chopps * check for boundaries - you've got to make sure that the
298 1.1 chopps * parameters have sensible values. Text-mode only!
299 1.1 chopps *
300 1.1 chopps * Since the blitter is unable to use a mask-pattern and a
301 1.1 chopps * certain fill-value at the same time, this routine uses
302 1.1 chopps * a simple trick: RZ3Init() clears a memory area twice as
303 1.1 chopps * large as the text-display needs, and RZ3AlphaErase then
304 1.1 chopps * simply uses RZ3AlphaCopy to copy the desired area from
305 1.1 chopps * the empty text-screen to the actually displayed screen.
306 1.1 chopps */
307 1.1 chopps
308 1.1 chopps void RZ3BitBlit (struct grf_bitblt * gbb );
309 1.1 chopps
310 1.1 chopps /*
311 1.1 chopps * RZ3BitBlit utilizes the blitter to perform one of 16
312 1.1 chopps * available logical operations on the display memory,
313 1.1 chopps * among them ordinary fill- and copy operations.
314 1.1 chopps * The only parameter is a pointer to a struct grf_bitblt:
315 1.1 chopps *
316 1.1 chopps * struct grf_bitblt {
317 1.1 chopps * unsigned short op; see above definitions of GRFBBOPxxx
318 1.1 chopps * unsigned short src_x, src_y; upper left corner of source-region
319 1.1 chopps * unsigned short dst_x, dst_y; upper left corner of dest-region
320 1.1 chopps * unsigned short w, h; width, height of region
321 1.1 chopps * unsigned short mask; bitmask to apply
322 1.1 chopps * };
323 1.1 chopps *
324 1.1 chopps * All coordinates are in pixels. RZ3BitBlit does not
325 1.1 chopps * check for boundaries - you've got to make sure that the
326 1.1 chopps * parameters have sensible values. 8 bit gfx-mode only!
327 1.1 chopps *
328 1.1 chopps * The blitter has a lot more capabilities, which aren't
329 1.1 chopps * currently used by theese routines, among them color-expanded
330 1.1 chopps * and text-blits, which can speed up GUIs like X11 a lot.
331 1.1 chopps * If you've got any idea how to make use of them within
332 1.1 chopps * your routines, contact me, and I'll implement the necessary
333 1.1 chopps * blit-operations.
334 1.1 chopps */
335 1.1 chopps
336 1.1 chopps void RZ3BitBlit16( struct grf_bitblt * gbb );
337 1.1 chopps
338 1.1 chopps /* Does the same as RZ3BitBlit(), but for 16-bit screens */
339 1.1 chopps
340 1.1 chopps void RZ3SetPanning(unsigned short xoff, unsigned short yoff);
341 1.1 chopps
342 1.1 chopps /*
343 1.1 chopps * Moves the logical coordinate (xoff, yoff) to the upper left corner
344 1.1 chopps * of your screen. Of course, you shouldn't specify excess values that would
345 1.1 chopps * show garbage in the lower right area of your screen... SetPanning()
346 1.1 chopps * does NOT check for boundaries.
347 1.1 chopps * Please read the documentation of RZ3SetHWCloc, too.
348 1.1 chopps */
349 1.1 chopps
350 1.1 chopps void RZ3SetupHWC (unsigned char col1, unsigned col2,
351 1.1 chopps unsigned char hsx, unsigned char hsy,
352 1.1 chopps const unsigned long * data);
353 1.1 chopps
354 1.1 chopps /*
355 1.1 chopps * Initializes and switches on the hardware-cursor sprite.
356 1.1 chopps * The parameters are:
357 1.1 chopps * col1 - the first color
358 1.1 chopps * col2 - the second color
359 1.1 chopps * hsx - hot-spot location offset x
360 1.1 chopps * hsy - hot-spot location offset y
361 1.1 chopps * data - a pointer to the bitmap data to be used for the sprite
362 1.1 chopps *
363 1.1 chopps * The organization of the data is - as always with MSDOS related
364 1.1 chopps * products - rather strange: The first and the second long-word
365 1.1 chopps * represent bitplane0 for the first 64 pixels. The following two
366 1.1 chopps * long-words represent bitplane1 for the first 64 pixels. But
367 1.1 chopps * the long-words are organized in Intel-fashion, beginning with
368 1.1 chopps * the least significant byte, ending with the most significant
369 1.1 chopps * one. The most significant bit of each byte is the leftmost,
370 1.1 chopps * as one would expect it. Now the weird color-assignments:
371 1.1 chopps *
372 1.1 chopps * bitplane0 bitplane1 result
373 1.1 chopps * 0 0 col2
374 1.1 chopps * 0 1 col1
375 1.1 chopps * 1 0 transparent
376 1.1 chopps * 1 1 background-color XOR 0xff
377 1.1 chopps *
378 1.1 chopps * The size of the data has to be 64*64*2/8 = 1024 byte,
379 1.1 chopps * obviously, the size of the sprite is 64x64 pixels.
380 1.1 chopps */
381 1.1 chopps
382 1.1 chopps
383 1.1 chopps void RZ3DisableHWC (void);
384 1.1 chopps
385 1.1 chopps /* simply disables the hardware-cursor sprite */
386 1.1 chopps
387 1.1 chopps void RZ3SetHWCloc (unsigned short x, unsigned short y);
388 1.1 chopps
389 1.1 chopps /*
390 1.1 chopps * sets the location of the hardwar-cursor sprite to x,y
391 1.1 chopps * relative to the logical screen beginning.
392 1.1 chopps * IMPORTANT: If you use RZ3SetHWCloc() to set the position
393 1.1 chopps * of the hardware-cursor sprite, all necessary panning is
394 1.1 chopps * done automatically - you can treat the display without
395 1.1 chopps * even knowing about the physical screen size that is
396 1.1 chopps * displayed.
397 1.1 chopps */
398 1.1 chopps
399 1.1 chopps #endif
400 1.1 chopps
401 1.1 chopps #endif /* RZ3_BSD_h */
402 1.1 chopps
403 1.1 chopps
404 1.1 chopps /* -------------- START OF CODE -------------- */
405 1.1 chopps
406 1.1 chopps /* read VGA register */
407 1.1 chopps #define vgar(ba, reg) (*(((volatile unsigned char *)ba)+reg))
408 1.1 chopps
409 1.1 chopps /* write VGA register */
410 1.1 chopps #define vgaw(ba, reg, val) \
411 1.1 chopps *(((volatile unsigned char *)ba)+reg) = val
412 1.1 chopps
413 1.1 chopps /*
414 1.1 chopps * defines for the used register addresses (mw)
415 1.1 chopps *
416 1.1 chopps * NOTE: there are some registers that have different addresses when
417 1.1 chopps * in mono or color mode. We only support color mode, and thus
418 1.1 chopps * some addresses won't work in mono-mode!
419 1.1 chopps */
420 1.1 chopps
421 1.1 chopps /* General Registers: */
422 1.1 chopps #define GREG_STATUS0_R 0x03C2
423 1.1 chopps #define GREG_STATUS1_R 0x03DA
424 1.1 chopps #define GREG_MISC_OUTPUT_R 0x03CC
425 1.1 chopps #define GREG_MISC_OUTPUT_W 0x03C2
426 1.1 chopps #define GREG_FEATURE_CONTROL_R 0x03CA
427 1.1 chopps #define GREG_FEATURE_CONTROL_W 0x03DA
428 1.1 chopps #define GREG_POS 0x0102
429 1.1 chopps
430 1.1 chopps /* Attribute Controller: */
431 1.1 chopps #define ACT_ADDRESS 0x03C0
432 1.1 chopps #define ACT_ADDRESS_R 0x03C0
433 1.1 chopps #define ACT_ADDRESS_W 0x03C0
434 1.1 chopps #define ACT_ADDRESS_RESET 0x03DA
435 1.1 chopps #define ACT_ID_PALETTE0 0x00
436 1.1 chopps #define ACT_ID_PALETTE1 0x01
437 1.1 chopps #define ACT_ID_PALETTE2 0x02
438 1.1 chopps #define ACT_ID_PALETTE3 0x03
439 1.1 chopps #define ACT_ID_PALETTE4 0x04
440 1.1 chopps #define ACT_ID_PALETTE5 0x05
441 1.1 chopps #define ACT_ID_PALETTE6 0x06
442 1.1 chopps #define ACT_ID_PALETTE7 0x07
443 1.1 chopps #define ACT_ID_PALETTE8 0x08
444 1.1 chopps #define ACT_ID_PALETTE9 0x09
445 1.1 chopps #define ACT_ID_PALETTE10 0x0A
446 1.1 chopps #define ACT_ID_PALETTE11 0x0B
447 1.1 chopps #define ACT_ID_PALETTE12 0x0C
448 1.1 chopps #define ACT_ID_PALETTE13 0x0D
449 1.1 chopps #define ACT_ID_PALETTE14 0x0E
450 1.1 chopps #define ACT_ID_PALETTE15 0x0F
451 1.1 chopps #define ACT_ID_ATTR_MODE_CNTL 0x10
452 1.1 chopps #define ACT_ID_OVERSCAN_COLOR 0x11
453 1.1 chopps #define ACT_ID_COLOR_PLANE_ENA 0x12
454 1.1 chopps #define ACT_ID_HOR_PEL_PANNING 0x13
455 1.1 chopps #define ACT_ID_COLOR_SELECT 0x14
456 1.1 chopps
457 1.1 chopps /* Graphics Controller: */
458 1.1 chopps #define GCT_ADDRESS 0x03CE
459 1.1 chopps #define GCT_ADDRESS_R 0x03CE
460 1.1 chopps #define GCT_ADDRESS_W 0x03CF
461 1.1 chopps #define GCT_ID_SET_RESET 0x00
462 1.1 chopps #define GCT_ID_ENABLE_SET_RESET 0x01
463 1.1 chopps #define GCT_ID_COLOR_COMPARE 0x02
464 1.1 chopps #define GCT_ID_DATA_ROTATE 0x03
465 1.1 chopps #define GCT_ID_READ_MAP_SELECT 0x04
466 1.1 chopps #define GCT_ID_GRAPHICS_MODE 0x05
467 1.1 chopps #define GCT_ID_MISC 0x06
468 1.1 chopps #define GCT_ID_COLOR_XCARE 0x07
469 1.1 chopps #define GCT_ID_BITMASK 0x08
470 1.1 chopps
471 1.1 chopps /* Sequencer: */
472 1.1 chopps #define SEQ_ADDRESS 0x03C4
473 1.1 chopps #define SEQ_ADDRESS_R 0x03C4
474 1.1 chopps #define SEQ_ADDRESS_W 0x03C5
475 1.1 chopps #define SEQ_ID_RESET 0x00
476 1.1 chopps #define SEQ_ID_CLOCKING_MODE 0x01
477 1.1 chopps #define SEQ_ID_MAP_MASK 0x02
478 1.1 chopps #define SEQ_ID_CHAR_MAP_SELECT 0x03
479 1.1 chopps #define SEQ_ID_MEMORY_MODE 0x04
480 1.1 chopps #define SEQ_ID_EXTENDED_ENABLE 0x05 /* down from here, all seq registers are NCR extensions */
481 1.1 chopps #define SEQ_ID_UNKNOWN1 0x06
482 1.1 chopps #define SEQ_ID_UNKNOWN2 0x07
483 1.1 chopps #define SEQ_ID_CHIP_ID 0x08
484 1.1 chopps #define SEQ_ID_UNKNOWN3 0x09
485 1.1 chopps #define SEQ_ID_CURSOR_COLOR1 0x0A
486 1.1 chopps #define SEQ_ID_CURSOR_COLOR0 0x0B
487 1.1 chopps #define SEQ_ID_CURSOR_CONTROL 0x0C
488 1.1 chopps #define SEQ_ID_CURSOR_X_LOC_HI 0x0D
489 1.1 chopps #define SEQ_ID_CURSOR_X_LOC_LO 0x0E
490 1.1 chopps #define SEQ_ID_CURSOR_Y_LOC_HI 0x0F
491 1.1 chopps #define SEQ_ID_CURSOR_Y_LOC_LO 0x10
492 1.1 chopps #define SEQ_ID_CURSOR_X_INDEX 0x11
493 1.1 chopps #define SEQ_ID_CURSOR_Y_INDEX 0x12
494 1.1 chopps #define SEQ_ID_CURSOR_STORE_HI 0x13 /* manual still wrong here.. argl! */
495 1.1 chopps #define SEQ_ID_CURSOR_STORE_LO 0x14 /* downto 0x16 */
496 1.1 chopps #define SEQ_ID_CURSOR_ST_OFF_HI 0x15
497 1.1 chopps #define SEQ_ID_CURSOR_ST_OFF_LO 0x16
498 1.1 chopps #define SEQ_ID_CURSOR_PIXELMASK 0x17
499 1.1 chopps #define SEQ_ID_PRIM_HOST_OFF_HI 0x18
500 1.1 chopps #define SEQ_ID_PRIM_HOST_OFF_LO 0x19
501 1.1 chopps #define SEQ_ID_LINEAR_0 0x1A
502 1.1 chopps #define SEQ_ID_LINEAR_1 0x1B
503 1.1 chopps #define SEQ_ID_SEC_HOST_OFF_HI 0x1C
504 1.1 chopps #define SEQ_ID_SEC_HOST_OFF_LO 0x1D
505 1.1 chopps #define SEQ_ID_EXTENDED_MEM_ENA 0x1E
506 1.1 chopps #define SEQ_ID_EXT_CLOCK_MODE 0x1F
507 1.1 chopps #define SEQ_ID_EXT_VIDEO_ADDR 0x20
508 1.1 chopps #define SEQ_ID_EXT_PIXEL_CNTL 0x21
509 1.1 chopps #define SEQ_ID_BUS_WIDTH_FEEDB 0x22
510 1.1 chopps #define SEQ_ID_PERF_SELECT 0x23
511 1.1 chopps #define SEQ_ID_COLOR_EXP_WFG 0x24
512 1.1 chopps #define SEQ_ID_COLOR_EXP_WBG 0x25
513 1.1 chopps #define SEQ_ID_EXT_RW_CONTROL 0x26
514 1.1 chopps #define SEQ_ID_MISC_FEATURE_SEL 0x27
515 1.1 chopps #define SEQ_ID_COLOR_KEY_CNTL 0x28
516 1.1 chopps #define SEQ_ID_COLOR_KEY_MATCH0 0x29
517 1.1 chopps #define SEQ_ID_COLOR_KEY_MATCH1 0x2A
518 1.1 chopps #define SEQ_ID_COLOR_KEY_MATCH2 0x2B
519 1.1 chopps #define SEQ_ID_UNKNOWN6 0x2C
520 1.1 chopps #define SEQ_ID_CRC_CONTROL 0x2D
521 1.1 chopps #define SEQ_ID_CRC_DATA_LOW 0x2E
522 1.1 chopps #define SEQ_ID_CRC_DATA_HIGH 0x2F
523 1.1 chopps #define SEQ_ID_MEMORY_MAP_CNTL 0x30
524 1.1 chopps #define SEQ_ID_ACM_APERTURE_1 0x31
525 1.1 chopps #define SEQ_ID_ACM_APERTURE_2 0x32
526 1.1 chopps #define SEQ_ID_ACM_APERTURE_3 0x33
527 1.1 chopps #define SEQ_ID_BIOS_UTILITY_0 0x3e
528 1.1 chopps #define SEQ_ID_BIOS_UTILITY_1 0x3f
529 1.1 chopps
530 1.1 chopps /* CRT Controller: */
531 1.1 chopps #define CRT_ADDRESS 0x03D4
532 1.1 chopps #define CRT_ADDRESS_R 0x03D5
533 1.1 chopps #define CRT_ADDRESS_W 0x03D5
534 1.1 chopps #define CRT_ID_HOR_TOTAL 0x00
535 1.1 chopps #define CRT_ID_HOR_DISP_ENA_END 0x01
536 1.1 chopps #define CRT_ID_START_HOR_BLANK 0x02
537 1.1 chopps #define CRT_ID_END_HOR_BLANK 0x03
538 1.1 chopps #define CRT_ID_START_HOR_RETR 0x04
539 1.1 chopps #define CRT_ID_END_HOR_RETR 0x05
540 1.1 chopps #define CRT_ID_VER_TOTAL 0x06
541 1.1 chopps #define CRT_ID_OVERFLOW 0x07
542 1.1 chopps #define CRT_ID_PRESET_ROW_SCAN 0x08
543 1.1 chopps #define CRT_ID_MAX_SCAN_LINE 0x09
544 1.1 chopps #define CRT_ID_CURSOR_START 0x0A
545 1.1 chopps #define CRT_ID_CURSOR_END 0x0B
546 1.1 chopps #define CRT_ID_START_ADDR_HIGH 0x0C
547 1.1 chopps #define CRT_ID_START_ADDR_LOW 0x0D
548 1.1 chopps #define CRT_ID_CURSOR_LOC_HIGH 0x0E
549 1.1 chopps #define CRT_ID_CURSOR_LOC_LOW 0x0F
550 1.1 chopps #define CRT_ID_START_VER_RETR 0x10
551 1.1 chopps #define CRT_ID_END_VER_RETR 0x11
552 1.1 chopps #define CRT_ID_VER_DISP_ENA_END 0x12
553 1.1 chopps #define CRT_ID_OFFSET 0x13
554 1.1 chopps #define CRT_ID_UNDERLINE_LOC 0x14
555 1.1 chopps #define CRT_ID_START_VER_BLANK 0x15
556 1.1 chopps #define CRT_ID_END_VER_BLANK 0x16
557 1.1 chopps #define CRT_ID_MODE_CONTROL 0x17
558 1.1 chopps #define CRT_ID_LINE_COMPARE 0x18
559 1.1 chopps #define CRT_ID_UNKNOWN1 0x19 /* are these register really void ? */
560 1.1 chopps #define CRT_ID_UNKNOWN2 0x1A
561 1.1 chopps #define CRT_ID_UNKNOWN3 0x1B
562 1.1 chopps #define CRT_ID_UNKNOWN4 0x1C
563 1.1 chopps #define CRT_ID_UNKNOWN5 0x1D
564 1.1 chopps #define CRT_ID_UNKNOWN6 0x1E
565 1.1 chopps #define CRT_ID_UNKNOWN7 0x1F
566 1.1 chopps #define CRT_ID_UNKNOWN8 0x20
567 1.1 chopps #define CRT_ID_UNKNOWN9 0x21
568 1.1 chopps #define CRT_ID_UNKNOWN10 0x22
569 1.1 chopps #define CRT_ID_UNKNOWN11 0x23
570 1.1 chopps #define CRT_ID_UNKNOWN12 0x24
571 1.1 chopps #define CRT_ID_UNKNOWN13 0x25
572 1.1 chopps #define CRT_ID_UNKNOWN14 0x26
573 1.1 chopps #define CRT_ID_UNKNOWN15 0x27
574 1.1 chopps #define CRT_ID_UNKNOWN16 0x28
575 1.1 chopps #define CRT_ID_UNKNOWN17 0x29
576 1.1 chopps #define CRT_ID_UNKNOWN18 0x2A
577 1.1 chopps #define CRT_ID_UNKNOWN19 0x2B
578 1.1 chopps #define CRT_ID_UNKNOWN20 0x2C
579 1.1 chopps #define CRT_ID_UNKNOWN21 0x2D
580 1.1 chopps #define CRT_ID_UNKNOWN22 0x2E
581 1.1 chopps #define CRT_ID_UNKNOWN23 0x2F
582 1.1 chopps #define CRT_ID_EXT_HOR_TIMING1 0x30 /* down from here, all crt registers are NCR extensions */
583 1.1 chopps #define CRT_ID_EXT_START_ADDR 0x31
584 1.1 chopps #define CRT_ID_EXT_HOR_TIMING2 0x32
585 1.1 chopps #define CRT_ID_EXT_VER_TIMING 0x33
586 1.1 chopps #define CRT_ID_MONITOR_POWER 0x34
587 1.1 chopps
588 1.1 chopps /* PLL chip (clock frequency synthesizer) I'm guessing here... */
589 1.1 chopps #define PLL_ADDRESS 0x83c8
590 1.1 chopps #define PLL_ADDRESS_W 0x83c9
591 1.1 chopps
592 1.1 chopps
593 1.1 chopps /* Video DAC */
594 1.1 chopps #define VDAC_ADDRESS 0x03c8
595 1.1 chopps #define VDAC_ADDRESS_W 0x03c8
596 1.1 chopps #define VDAC_ADDRESS_R 0x03c7
597 1.1 chopps #define VDAC_STATE 0x03c7
598 1.1 chopps #define VDAC_DATA 0x03c9
599 1.1 chopps #define VDAC_MASK 0x03c6
600 1.1 chopps
601 1.1 chopps
602 1.1 chopps /* Accelerator Control Menu (memory mapped registers, includes blitter) */
603 1.1 chopps #define ACM_PRIMARY_OFFSET 0x00
604 1.1 chopps #define ACM_SECONDARY_OFFSET 0x04
605 1.1 chopps #define ACM_MODE_CONTROL 0x08
606 1.1 chopps #define ACM_CURSOR_POSITION 0x0c
607 1.1 chopps #define ACM_START_STATUS 0x30
608 1.1 chopps #define ACM_CONTROL 0x34
609 1.1 chopps #define ACM_RASTEROP_ROTATION 0x38
610 1.1 chopps #define ACM_BITMAP_DIMENSION 0x3c
611 1.1 chopps #define ACM_DESTINATION 0x40
612 1.1 chopps #define ACM_SOURCE 0x44
613 1.1 chopps #define ACM_PATTERN 0x48
614 1.1 chopps #define ACM_FOREGROUND 0x4c
615 1.1 chopps #define ACM_BACKGROUND 0x50
616 1.1 chopps
617 1.1 chopps
618 1.1 chopps #define WGfx(ba, idx, val) \
619 1.1 chopps do { vgaw(ba, GCT_ADDRESS, idx); vgaw(ba, GCT_ADDRESS_W , val); } while (0)
620 1.1 chopps
621 1.1 chopps #define WSeq(ba, idx, val) \
622 1.1 chopps do { vgaw(ba, SEQ_ADDRESS, idx); vgaw(ba, SEQ_ADDRESS_W , val); } while (0)
623 1.1 chopps
624 1.1 chopps #define WCrt(ba, idx, val) \
625 1.1 chopps do { vgaw(ba, CRT_ADDRESS, idx); vgaw(ba, CRT_ADDRESS_W , val); } while (0)
626 1.1 chopps
627 1.1 chopps #define WAttr(ba, idx, val) \
628 1.1 chopps do { vgaw(ba, ACT_ADDRESS, idx); vgaw(ba, ACT_ADDRESS_W, val); } while (0)
629 1.1 chopps
630 1.1 chopps #define Map(m) \
631 1.1 chopps do { WGfx(ba, GCT_ID_READ_MAP_SELECT, m & 3 ); WSeq(ba, SEQ_ID_MAP_MASK, (1 << (m & 3))); } while (0)
632 1.1 chopps
633 1.1 chopps #define WPLL(ba, idx, val) \
634 1.1 chopps do { vgaw(ba, PLL_ADDRESS, idx);\
635 1.1 chopps vgaw(ba, PLL_ADDRESS_W, (val & 0xff));\
636 1.1 chopps vgaw(ba, PLL_ADDRESS_W, (val >> 8)); } while (0)
637 1.1 chopps
638 1.1 chopps
639 1.1 chopps static inline unsigned char RAttr(volatile void * ba, short idx) {
640 1.1 chopps vgaw (ba, ACT_ADDRESS, idx);
641 1.1 chopps return vgar (ba, ACT_ADDRESS_R);
642 1.1 chopps }
643 1.1 chopps
644 1.1 chopps static inline unsigned char RSeq(volatile void * ba, short idx) {
645 1.1 chopps vgaw (ba, SEQ_ADDRESS, idx);
646 1.1 chopps return vgar (ba, SEQ_ADDRESS_R);
647 1.1 chopps }
648 1.1 chopps
649 1.1 chopps static inline unsigned char RCrt(volatile void * ba, short idx) {
650 1.1 chopps vgaw (ba, CRT_ADDRESS, idx);
651 1.1 chopps return vgar (ba, CRT_ADDRESS_R);
652 1.1 chopps }
653 1.1 chopps
654 1.1 chopps static inline unsigned char RGfx(volatile void * ba, short idx) {
655 1.1 chopps vgaw(ba, GCT_ADDRESS, idx);
656 1.1 chopps return vgar (ba, GCT_ADDRESS_R);
657 1.1 chopps }
658 1.1 chopps
659 1.1 chopps void RZ3DisableHWC __P((struct grf_softc *gp));
660 1.1 chopps void RZ3SetupHWC __P((struct grf_softc *gp, unsigned char col1, unsigned int col2, unsigned char hsx, unsigned char hsy, const long unsigned int *data));
661 1.1 chopps void RZ3AlphaErase __P((struct grf_softc *gp, short unsigned int xd, short unsigned int yd, short unsigned int w, short unsigned int h));
662 1.1 chopps void RZ3AlphaCopy __P((struct grf_softc *gp, short unsigned int xs, short unsigned int ys, short unsigned int xd, short unsigned int yd, short unsigned int w, short unsigned int h));
663 1.1 chopps void RZ3BitBlit __P((struct grf_softc *gp, struct grf_bitblt *gbb));
664 1.1 chopps void RZ3BitBlit16 __P((struct grf_softc *gp, struct grf_bitblt *gbb));
665 1.1 chopps void RZ3SetCursorPos __P((struct grf_softc *gp, short unsigned int pos));
666 1.1 chopps void RZ3LoadPalette __P((struct grf_softc *gp, unsigned char *pal, unsigned char firstcol, unsigned char colors));
667 1.1 chopps void RZ3SetPalette __P((struct grf_softc *gp, unsigned char colornum, unsigned char red, unsigned char green, unsigned char blue));
668 1.1 chopps void RZ3SetPanning __P((struct grf_softc *gp, short unsigned int xoff, short unsigned int yoff));
669 1.1 chopps void RZ3SetHWCloc __P((struct grf_softc *gp, short unsigned int x, short unsigned int y));
670 1.1 chopps int rh_mode __P((register struct grf_softc *gp, int cmd, void *arg, int a2, int a3));
671 1.3 chopps int rh_ioctl __P((register struct grf_softc *gp, u_long cmd, void *data));
672 1.1 chopps int rh_getcmap __P((struct grf_softc *gfp, struct grf_colormap *cmap));
673 1.1 chopps int rh_putcmap __P((struct grf_softc *gfp, struct grf_colormap *cmap));
674 1.1 chopps int rh_getspritepos __P((struct grf_softc *gp, struct grf_position *pos));
675 1.1 chopps int rh_setspritepos __P((struct grf_softc *gp, struct grf_position *pos));
676 1.1 chopps int rh_getspriteinfo __P((struct grf_softc *gp, struct grf_spriteinfo *info));
677 1.1 chopps int rh_setspriteinfo __P((struct grf_softc *gp, struct grf_spriteinfo *info));
678 1.1 chopps int rh_getspritemax __P((struct grf_softc *gp, struct grf_position *pos));
679 1.1 chopps int rh_bitblt __P((struct grf_softc *gp, struct grf_bitblt *bb));
680 1.1 chopps
681 1.1 chopps
682 1.1 chopps struct ite_softc;
683 1.1 chopps void rh_init __P((struct ite_softc *));
684 1.1 chopps void rh_cursor __P((struct ite_softc *, int));
685 1.1 chopps void rh_deinit __P((struct ite_softc *));
686 1.1 chopps void rh_putc __P((struct ite_softc *, int, int, int, int));
687 1.1 chopps void rh_clear __P((struct ite_softc *, int, int, int, int));
688 1.1 chopps void rh_scroll __P((struct ite_softc *, int, int, int, int));
689 1.1 chopps
690 1.1 chopps #endif /* _GRF_RHREG_H */
691