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