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