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