xref: /netbsd-src/sys/arch/amiga/dev/grf_rtreg.h (revision ae1bfcddc410612bc8c58b807e1830becb69a24c)
1 /*
2  *	$Id: grf_rtreg.h,v 1.4 1994/05/08 05:53:08 chopps Exp $
3  */
4 
5 #ifndef _GRF_RTREG_H
6 #define _GRF_RTREG_H
7 
8 /* NOTE: this driver for the MacroSystem Retina board was only possible,
9          because MacroSystem provided information about the pecularities
10          of the board. THANKS! Competition in Europe among gfx board
11          manufacturers is rather tough, so Lutz Vieweg, who wrote the
12          initial driver, has made an agreement with MS not to document
13          the driver source (see also his Copyright disclaimer at the
14          beginning of grf_rt.cc and ite_rt.cc).
15          -> ALL comments and register defines after
16 	 -> "/* -------------- START OF CODE -------------- * /"
17 	 -> have been added by myself (mw) from studying the publically
18 	 -> available "NCR 77C22E+" Data Manual
19 
20 	 Lutz' original driver source (without any of my comments) is
21 	 available on request. */
22 
23 
24 #if 0
25 /* these are in dev/devices.h */
26 
27 /* definitions to find the autoconfig-board under
28    AmigaDOS */
29 
30 #define RETINA_MANUFACTURER     0x4754
31 #define RETINA_PRODUCT          6
32 #define RETINA_SERIALNUMBER     1
33 #endif
34 
35 
36 /*
37    For more information on the structure entries take a look at
38    grf_rt.cc and ite_rt.cc.
39 */
40 
41 struct MonDef {
42 
43 	/* first the general monitor characteristics */
44 
45 	unsigned long  FQ;
46 	unsigned char  FLG;
47 
48 	unsigned short MW;  /* screen width in pixels */
49                             /* has to be at least a multiple of 8, */
50                             /* has to be a multiple of 64 in 256-color mode */
51                             /* if you want to use some great tricks */
52                             /* to speed up the vertical scrolling */
53 	unsigned short MH;  /* screen height in pixels */
54 
55 	unsigned short HBS;
56 	unsigned short HSS;
57 	unsigned short HSE;
58 	unsigned short HBE;
59 	unsigned short HT;
60 	unsigned short VBS;
61 	unsigned short VSS;
62 	unsigned short VSE;
63 	unsigned short VBE;
64 	unsigned short VT;
65 
66 	unsigned short DEP;  /* Color-depth, 4 for text-mode */
67                              /* 8 enables 256-color graphics-mode, */
68                              /* 16 and 24bit gfx not supported yet */
69 
70 	unsigned char * PAL; /* points to 16*3 byte RGB-palette data */
71                              /* use LoadPalette() to set colors 0..255 */
72                              /* in 256-color-gfx mode */
73 
74 	/* all following entries are font-specific in
75 	   text mode. Make sure your monitor
76 	   parameters are calculated for the
77 	   appropriate font width and height!
78 	*/
79 
80        unsigned short  TX;     /* Text-mode (DEP=4):          */
81                                /* screen-width  in characters */
82                                /* currently, TX has to be a   */
83                                /* multiple of 16!             */
84 
85                                /* Gfx-mode (DEP > 4)          */
86                                /* "logical" screen-width,     */
87                                /* use values > MW to allow    */
88                                /* hardware-panning            */
89                                /* has to be a multiple of 8   */
90 
91        unsigned short  TY;     /* Text-mode:                  */
92                                /* screen-height in characters */
93 
94                                /* Gfx-mode: "logical" screen  */
95                                /* height for panning          */
96 
97        /* the following values are currently unused for gfx-mode */
98 
99 	unsigned short  XY;     /* TX*TY (speeds up some calcs.) */
100 
101 	unsigned short  FX;     /* font-width (valid values: 4,7-16) */
102 	unsigned short  FY;     /* font-height (valid range: 1-32) */
103 	unsigned char * FData;  /* pointer to the font-data */
104 
105 	/* The font data is simply an array of bytes defining
106 	   the chars in ascending order, line by line. If your
107 	   font is wider than 8 pixel, FData has to be an
108 	   array of words. */
109 
110 	unsigned short  FLo;    /* lowest character defined */
111 	unsigned short  FHi;    /* highest char. defined */
112 
113 };
114 
115 
116 #if 0
117 /* Some ready-made MonDef structures are available in grf_rt.cc */
118 
119 extern struct MonDef MON_640_512_60;
120 extern struct MonDef MON_768_600_60;
121 extern struct MonDef MON_768_600_80;
122 
123 /* text-screen resolutions wider than 1024 are currently damaged.
124    The VRAM access seems to become unstable at higher resolutions.
125    This may hopefully be subject of change.
126 */
127 
128 extern struct MonDef MON_1024_768_80;
129 extern struct MonDef MON_1024_1024_59;
130 
131 /* WARNING: THE FOLLOWING MONITOR MODES EXCEED THE 90-MHz LIMIT THE PROCESSOR
132             HAS BEEN SPECIFIED FOR. USE AT YOUR OWN RISK (AND THINK ABOUT
133             MOUNTING SOME COOLING DEVICE AT THE PROCESSOR AND RAMDAC)!     */
134 extern struct MonDef MON_1280_1024_60;
135 extern struct MonDef MON_1280_1024_69;
136 
137 /* Default monitor (change if this is too much for your monitor :-)) */
138 #define DEFAULT_MONDEF	MON_768_600_80
139 
140 #else
141 
142 /* nothing exported for now... */
143 
144 #endif
145 
146 /* a standard 16-color palette is available in grf_rt.cc
147    and used by the standard monitor-definitions above */
148 extern unsigned char NCRStdPalette[];
149 
150 /* The prototypes for C
151    with a little explanation
152 
153 	unsigned char * InitNCR(volatile void * BoardAdress, struct MonDef * md = &MON_640_512_60);
154 
155    This routine initialises the Retina hardware, opens a
156    text- or gfx-mode screen, depending on the the value of MonDef.DEP,
157    and sets the cursor to position 0.
158    It takes as arguments a pointer to the hardware-base
159    address as it is denoted in the DevConf structure
160    of the AmigaDOS, and a pointer to a struct MonDef
161    which describes the screen-mode parameters.
162 
163    The routine returns 0 if it was unable to open the screen,
164    or an unsigned char * to the display/attribute memory
165    when it succeeded. The organisation of the display memory
166    is a little strange in text-mode (Intel-typically...) :
167 
168    Byte  00    01    02    03    04     05    06   etc.
169        Char0  Attr0  --    --   Char1 Attr1   --   etc.
170 
171    You may set a character and its associated attribute byte
172    with a single word-access, or you may perform to byte writes
173    for the char and attribute. Each 2. word has no meaning,
174    and writes to theese locations are ignored.
175 
176    The attribute byte for each character has the following
177    structure:
178 
179    Bit  7     6     5     4     3     2     1     0
180       BLINK BACK2 BACK1 BACK0 FORE3 FORE2 FORE1 FORE0
181 
182    Were FORE is the foreground-color index (0-15) and
183    BACK is the background color index (0-7). BLINK
184    enables blinking for the associated character.
185    The higher 8 colors in the standard palette are
186    lighter than the lower 8, so you may see FORE3 as
187    an intensity bit. If FORE == 1 or FORE == 9 and
188    BACK == 0 the character is underlined. Since I don't
189    think this looks good, it will probably change in a
190    future release.
191 
192    There's no routine "SetChar" or "SetAttr" provided,
193    because I think it's so trivial... a function call
194    would be pure overhead. As an example, a routine
195    to set the char code and attribute at position x,y:
196    (assumed the value returned by InitNCR was stored
197     into "DispMem", the actual MonDef struct * is hold
198     in "MDef")
199 
200    void SetChar(unsigned char chr, unsigned char attr,
201                 unsigned short x, unsigned short y) {
202 
203       unsigned struct MonDef * md = MDef;
204       unsigned char * c = DispMem + x*4 + y*md->TX*4;
205 
206       *c++ = chr;
207       *c   = attr;
208 
209    }
210 
211    In Gfx-mode, the memory organisation is rather simple,
212    1 byte per pixel in 256-color mode, one pixel after
213    each other, line by line.
214 
215    Currently, InitNCR() disables the Retina VBLANK IRQ,
216    but beware: When running the Retina WB-Emu under
217    AmigaDOS, the VBLANK IRQ is ENABLED.
218 
219 	void SetCursorPos(unsigned short pos);
220 
221    This routine sets the hardware-cursor position
222    to the screen location pos. pos can be calculated
223    as (x + y * md->TY).
224    Text-mode only!
225 
226 	void ScreenUp(void);
227 
228    A somewhat optimized routine that scrolls the whole
229    screen up one row. A good idea to compile this piece
230    of code with optimization enabled.
231    Text-mode only!
232 
233 	void ScreenDown(void);
234 
235    A somewhat optimized routine that scrolls the whole
236    screen down one row. A good idea to compile this piece
237    of code with optimization enabled.
238    Text-mode only!
239 
240 	unsigned char * SetSegmentPtr(unsigned long adress);
241 
242    Sets the beginning of the 64k-memory segment to the
243    adress specified by the unsigned long. If adress MOD 64
244    is != 0, the return value will point to the segments
245    start in the Amiga adress space + (adress MOD 64).
246    Don't use more than (65536-64) bytes in the segment
247    you set if you aren't sure that (adress MOD 64) == 0.
248    See retina.doc from MS for further information.
249 
250 	void ClearScreen(unsigned char color);
251 
252    Fills the whole screen with "color" - 256-color mode only!
253 
254 	void LoadPalette(unsigned char * pal, unsigned char firstcol,
255 	                 unsigned char colors);
256 
257    Loads the palette-registers. "pal" points to an array of unsigned char
258    triplets, for the red, green and blue component. "firstcol" determines the
259    number of the first palette-register to load (256 available). "colors"
260    is the number of colors you want to put in the palette registers.
261 
262 	void SetPalette(unsigned char colornum, unsigned char red,
263 	                unsigned char green, unsigned char blue);
264 
265    Allows you to set a single color in the palette, "colornum" is the number
266    of the palette entry (256 available), "red", "green" and "blue" are the
267    three components.
268 
269 	void SetPanning(unsigned short xoff, unsigned short yoff);
270 
271    Moves the logical coordinate (xoff, yoff) to the upper left corner
272    of your screen. Of course, you shouldn't specify excess values that would
273    show garbage in the lower right area of your screen... SetPanning()
274    does NOT check for boundaries.
275 */
276 
277 /* -------------- START OF CODE -------------- */
278 
279 /* read VGA register */
280 #define vgar(ba, reg) (*(((volatile unsigned char *)ba)+reg))
281 
282 /* write VGA register */
283 #define vgaw(ba, reg, val) \
284 	*(((volatile unsigned char *)ba)+reg) = val
285 
286 /* defines for the used register addresses (mw)
287 
288    NOTE: there are some registers that have different addresses when
289          in mono or color mode. We only support color mode, and thus
290          some addresses won't work in mono-mode! */
291 
292 /* General Registers: */
293 #define GREG_STATUS0_R		0x43C2
294 #define GREG_STATUS1_R		0x43DA
295 #define GREG_MISC_OUTPUT_R	0x43CC
296 #define GREG_MISC_OUTPUT_W	0x43C2
297 #define GREG_FEATURE_CONTROL_R	0x43CA
298 #define GREG_FEATURE_CONTROL_W	0x43DA
299 #define GREG_POS		0x4102
300 
301 /* Attribute Controller: */
302 #define ACT_ADDRESS		0x43C0
303 #define ACT_ADDRESS_R		0x03C0
304 #define ACT_ADDRESS_W		0x43C0
305 #define ACT_ID_PALETTE0		0x00
306 #define ACT_ID_PALETTE1		0x01
307 #define ACT_ID_PALETTE2		0x02
308 #define ACT_ID_PALETTE3		0x03
309 #define ACT_ID_PALETTE4		0x04
310 #define ACT_ID_PALETTE5		0x05
311 #define ACT_ID_PALETTE6		0x06
312 #define ACT_ID_PALETTE7		0x07
313 #define ACT_ID_PALETTE8		0x08
314 #define ACT_ID_PALETTE9		0x09
315 #define ACT_ID_PALETTE10	0x0A
316 #define ACT_ID_PALETTE11	0x0B
317 #define ACT_ID_PALETTE12	0x0C
318 #define ACT_ID_PALETTE13	0x0D
319 #define ACT_ID_PALETTE14	0x0E
320 #define ACT_ID_PALETTE15	0x0F
321 #define ACT_ID_ATTR_MODE_CNTL	0x10
322 #define ACT_ID_OVERSCAN_COLOR	0x11
323 #define ACT_ID_COLOR_PLANE_ENA	0x12
324 #define ACT_ID_HOR_PEL_PANNING	0x13
325 #define ACT_ID_COLOR_SELECT	0x14
326 
327 /* Graphics Controller: */
328 #define GCT_ADDRESS		0x43CE
329 #define GCT_ADDRESS_R		0x03CE
330 #define GCT_ADDRESS_W		0x03CE
331 #define GCT_ID_SET_RESET	0x00
332 #define GCT_ID_ENABLE_SET_RESET	0x01
333 #define GCT_ID_COLOR_COMPARE	0x02
334 #define GCT_ID_DATA_ROTATE	0x03
335 #define GCT_ID_READ_MAP_SELECT	0x04
336 #define GCT_ID_GRAPHICS_MODE	0x05
337 #define GCT_ID_MISC		0x06
338 #define GCT_ID_COLOR_XCARE	0x07
339 #define GCT_ID_BITMASK		0x08
340 
341 /* Sequencer: */
342 #define SEQ_ADDRESS		0x43C4
343 #define SEQ_ADDRESS_R		0x03C4
344 #define SEQ_ADDRESS_W		0x03C4
345 #define SEQ_ID_RESET		0x00
346 #define SEQ_ID_CLOCKING_MODE	0x01
347 #define SEQ_ID_MAP_MASK		0x02
348 #define SEQ_ID_CHAR_MAP_SELECT	0x03
349 #define SEQ_ID_MEMORY_MODE	0x04
350 #define SEQ_ID_EXTENDED_ENABLE	0x05	/* down from here, all seq registers are NCR extensions */
351 #define SEQ_ID_UNKNOWN1         0x06	/* it does exist so it's probably usefull */
352 #define SEQ_ID_UNKNOWN2         0x07	/* it does exist so it's probably usefull */
353 #define SEQ_ID_CHIP_ID		0x08
354 #define SEQ_ID_UNKNOWN3         0x09	/* it does exist so it's probably usefull */
355 #define SEQ_ID_CURSOR_COLOR1	0x0A
356 #define SEQ_ID_CURSOR_COLOR0	0x0B
357 #define SEQ_ID_CURSOR_CONTROL	0x0C
358 #define SEQ_ID_CURSOR_X_LOC_HI	0x0D
359 #define SEQ_ID_CURSOR_X_LOC_LO	0x0E
360 #define SEQ_ID_CURSOR_Y_LOC_HI	0x0F
361 #define SEQ_ID_CURSOR_Y_LOC_LO	0x10
362 #define SEQ_ID_CURSOR_X_INDEX	0x11
363 #define SEQ_ID_CURSOR_Y_INDEX	0x12
364 #define SEQ_ID_CURSOR_STORE_HI	0x13	/* printed manual is wrong about these.. */
365 #define SEQ_ID_CURSOR_STORE_LO	0x14
366 #define SEQ_ID_CURSOR_ST_OFF_HI	0x15
367 #define SEQ_ID_CURSOR_ST_OFF_LO	0x16
368 #define SEQ_ID_CURSOR_PIXELMASK	0x17
369 #define SEQ_ID_PRIM_HOST_OFF_HI	0x18
370 #define SEQ_ID_PRIM_HOST_OFF_LO	0x19
371 #define SEQ_ID_DISP_OFF_HI	0x1A
372 #define SEQ_ID_DISP_OFF_LO	0x1B
373 #define SEQ_ID_SEC_HOST_OFF_HI	0x1C
374 #define SEQ_ID_SEC_HOST_OFF_LO	0x1D
375 #define SEQ_ID_EXTENDED_MEM_ENA	0x1E
376 #define SEQ_ID_EXT_CLOCK_MODE	0x1F
377 #define SEQ_ID_EXT_VIDEO_ADDR	0x20
378 #define SEQ_ID_EXT_PIXEL_CNTL	0x21
379 #define SEQ_ID_BUS_WIDTH_FEEDB	0x22
380 #define SEQ_ID_PERF_SELECT	0x23
381 #define SEQ_ID_COLOR_EXP_WFG	0x24
382 #define SEQ_ID_COLOR_EXP_WBG	0x25
383 #define SEQ_ID_EXT_RW_CONTROL	0x26
384 #define SEQ_ID_MISC_FEATURE_SEL	0x27
385 #define SEQ_ID_COLOR_KEY_CNTL	0x28
386 #define SEQ_ID_COLOR_KEY_MATCH	0x29
387 #define SEQ_ID_UNKNOWN4         0x2A
388 #define SEQ_ID_UNKNOWN5         0x2B
389 #define SEQ_ID_UNKNOWN6         0x2C
390 #define SEQ_ID_CRC_CONTROL	0x2D
391 #define SEQ_ID_CRC_DATA_LOW	0x2E
392 #define SEQ_ID_CRC_DATA_HIGH	0x2F
393 
394 /* CRT Controller: */
395 #define CRT_ADDRESS		0x43D4
396 #define CRT_ADDRESS_R		0x03D4
397 #define CRT_ADDRESS_W		0x03D4
398 #define CRT_ID_HOR_TOTAL	0x00
399 #define CRT_ID_HOR_DISP_ENA_END	0x01
400 #define CRT_ID_START_HOR_BLANK	0x02
401 #define CRT_ID_END_HOR_BLANK	0x03
402 #define CRT_ID_START_HOR_RETR	0x04
403 #define CRT_ID_END_HOR_RETR	0x05
404 #define CRT_ID_VER_TOTAL	0x06
405 #define CRT_ID_OVERFLOW		0x07
406 #define CRT_ID_PRESET_ROW_SCAN	0x08
407 #define CRT_ID_MAX_SCAN_LINE	0x09
408 #define CRT_ID_CURSOR_START	0x0A
409 #define CRT_ID_CURSOR_END	0x0B
410 #define CRT_ID_START_ADDR_HIGH	0x0C
411 #define CRT_ID_START_ADDR_LOW	0x0D
412 #define CRT_ID_CURSOR_LOC_HIGH	0x0E
413 #define CRT_ID_CURSOR_LOC_LOW	0x0F
414 #define CRT_ID_START_VER_RETR	0x10
415 #define CRT_ID_END_VER_RETR	0x11
416 #define CRT_ID_VER_DISP_ENA_END	0x12
417 #define CRT_ID_OFFSET		0x13
418 #define CRT_ID_UNDERLINE_LOC	0x14
419 #define CRT_ID_START_VER_BLANK	0x15
420 #define CRT_ID_END_VER_BLANK	0x16
421 #define CRT_ID_MODE_CONTROL	0x17
422 #define CRT_ID_LINE_COMPARE	0x18
423 #define CRT_ID_UNKNOWN1         0x19	/* are these register really void ? */
424 #define CRT_ID_UNKNOWN2         0x1A
425 #define CRT_ID_UNKNOWN3         0x1B
426 #define CRT_ID_UNKNOWN4         0x1C
427 #define CRT_ID_UNKNOWN5         0x1D
428 #define CRT_ID_UNKNOWN6         0x1E
429 #define CRT_ID_UNKNOWN7         0x1F
430 #define CRT_ID_UNKNOWN8         0x20
431 #define CRT_ID_UNKNOWN9         0x21
432 #define CRT_ID_UNKNOWN10      	0x22
433 #define CRT_ID_UNKNOWN11      	0x23
434 #define CRT_ID_UNKNOWN12      	0x24
435 #define CRT_ID_UNKNOWN13      	0x25
436 #define CRT_ID_UNKNOWN14      	0x26
437 #define CRT_ID_UNKNOWN15      	0x27
438 #define CRT_ID_UNKNOWN16      	0x28
439 #define CRT_ID_UNKNOWN17      	0x29
440 #define CRT_ID_UNKNOWN18      	0x2A
441 #define CRT_ID_UNKNOWN19      	0x2B
442 #define CRT_ID_UNKNOWN20      	0x2C
443 #define CRT_ID_UNKNOWN21      	0x2D
444 #define CRT_ID_UNKNOWN22      	0x2E
445 #define CRT_ID_UNKNOWN23      	0x2F
446 #define CRT_ID_EXT_HOR_TIMING1	0x30	/* down from here, all crt registers are NCR extensions */
447 #define CRT_ID_EXT_START_ADDR	0x31
448 #define CRT_ID_EXT_HOR_TIMING2	0x32
449 #define CRT_ID_EXT_VER_TIMING	0x33
450 
451 /* Video DAC (these are *pure* guesses from the usage of these registers,
452    I don't have a data sheet for this chip:-/) */
453 #define VDAC_REG_D		0x800d	/* well.. */
454 #define VDAC_REG_SELECT		0x8001	/* perhaps.. */
455 #define VDAC_REG_DATA		0x8003	/* dito.. */
456 
457 #define WGfx(ba, idx, val) \
458 	do { vgaw(ba, GCT_ADDRESS, idx); vgaw(ba, GCT_ADDRESS_W , val); } while (0)
459 
460 #define WSeq(ba, idx, val) \
461 	do { vgaw(ba, SEQ_ADDRESS, idx); vgaw(ba, SEQ_ADDRESS_W , val); } while (0)
462 
463 #define WCrt(ba, idx, val) \
464 	do { vgaw(ba, CRT_ADDRESS, idx); vgaw(ba, CRT_ADDRESS_W , val); } while (0)
465 
466 #define WAttr(ba, idx, val) \
467 	do { vgaw(ba, ACT_ADDRESS, idx); vgaw(ba, ACT_ADDRESS_W, val); } while (0)
468 
469 #define Map(m) \
470 	do { WGfx(ba, GCT_ID_READ_MAP_SELECT, m & 3 ); WSeq(ba, SEQ_ID_MAP_MASK, (1 << (m & 3))); } while (0)
471 
472 static inline unsigned char RAttr(volatile void * ba, short idx) {
473 	vgaw (ba, ACT_ADDRESS, idx);
474 	return vgar (ba, ACT_ADDRESS_R);
475 }
476 
477 static inline unsigned char RSeq(volatile void * ba, short idx) {
478 	vgaw (ba, SEQ_ADDRESS, idx);
479 	return vgar (ba, SEQ_ADDRESS_R);
480 }
481 
482 static inline unsigned char RCrt(volatile void * ba, short idx) {
483 	vgaw (ba, CRT_ADDRESS, idx);
484 	return vgar (ba, CRT_ADDRESS_R);
485 }
486 
487 static inline unsigned char RGfx(volatile void * ba, short idx) {
488 	vgaw(ba, GCT_ADDRESS, idx);
489 	return vgar (ba, GCT_ADDRESS_R);
490 }
491 
492 int grfrt_cnprobe __P((void));
493 void grfrt_iteinit __P((struct grf_softc *));
494 #endif /* _GRF_RTREG_H */
495