/* $XFree86: xc/programs/Xserver/hw/xfree86/mono/drivers/hgc1280/hgc1280HW.h,v 3.0 1994/05/04 15:01:10 dawes Exp $ */ /* * MONO: Driver family for interlaced and banked monochrome video adaptors * Pascal Haible 8/93, 3/94, 4/94 haible@IZFM.Uni-Stuttgart.DE * * mono/driver/hgc1280/hgc1280HW.h * * see mono/COPYRIGHT for copyright and disclaimers. */ #include "compiler.h" /* void outb(port,val); void outw(port,val); unsigned int inb(port); unsigned int inw(port); void intr_disable(); void intr_enable(); short port; short val; */ /* * Primary I/O Base 0x3B0 * Secondary I/O Base 0x390 */ #define HGC_PRIM_PORT_BASE 0x3B0 #define HGC_PRIM_PORT_INDEX 0x3B0 #define HGC_PRIM_PORT_DATA 0x3B1 #define HGC_PRIM_PORT_CONTROL 0x3B8 #define HGC_PRIM_PORT_CRT_STATUS 0x3BA #define HGC_PRIM_PORT_CONFIG 0x3BF #define HGC_SEC_PORT_BASE 0x390 #define HGC_SEC_PORT_INDEX 0x390 #define HGC_SEC_PORT_DATA 0x391 #define HGC_SEC_PORT_CONTROL 0x398 #define HGC_SEC_PORT_CRT_STATUS 0x39A #define HGC_SEC_PORT_CONFIG 0x39F #define HGC_REG_BANK1 0x22 #define HGC_REG_BANK2 0x24 #define HGC_REG_SHIFT_DISPLAY 0x2D #define HGC_REG_LEFT_BORDER 0x2A #define HGC_REG_RIGHT_BORDER 0x2B #define HGC_NUM_REGS (0x40) #define HGC_PRIM_MEM_BASE (0xB0000L) #define HGC_SEC_MEM_BASE (0xC8000L) #define HGC_BANK_SIZE (0x4000L) #define HGC_MEM_BASE_BANK1 (0L) #define HGC_MEM_BASE_BANK2 (HGC_BANK_SIZE) /* rel. to HGC_XXX_MAP_BASE */ #define HGC_BANK1_BOTTOM (HGC_MEM_BASE_BANK1) #define HGC_BANK1_TOP (HGC_BANK1_BOTTOM+HGC_BANK_SIZE) #define HGC_BANK2_BOTTOM (HGC_MEM_BASE_BANK2) #define HGC_BANK2_TOP (HGC_BANK2_BOTTOM+HGC_BANK_SIZE) #define HGC_PRIM_MAP_BASE (HGC_PRIM_MEM_BASE) #define HGC_SEC_MAP_BASE (HGC_SEC_MEM_BASE) #define HGC_MAP_SIZE (2*HGC_BANK_SIZE) #define HGC_SEGMENT_SIZE (HGC_BANK_SIZE) #define HGC_SEGMENT_SHIFT (14) #define HGC_SEGMENT_MASK (0x3FFFL) #define HGC_HDISPLAY (1280) #define HGC_VDISPLAY (1024) #define HGC_MAX_VIRTUAL_X (1472) #define HGC_MAX_VIRTUAL_Y (1024) #define HGC_SCAN_LINE_WIDTH (2048) /* HGC-1280 needs some delay between the setting of at least some of * the registers. I'm not sure if it is the usual I/O recovery or * something else. Anyway, on my setup I need both inb() when setting * the mode registers. Setting the banking regs seems to work without * this delay. */ #define IO_RECOVER_PRIM { volatile unsigned char io_recover_dummy; \ io_recover_dummy=inb(HGC_PRIM_PORT_INDEX); \ io_recover_dummy=inb(HGC_PRIM_PORT_INDEX); } #define IO_RECOVER_SEC { volatile unsigned char io_recover_dummy; \ io_recover_dummy=inb(HGC_SEC_PORT_INDEX); \ io_recover_dummy=inb(HGC_SEC_PORT_INDEX); } #define HGC_PRIM_SET_REG(reg,val) { outb(HGC_PRIM_PORT_INDEX,reg); \ IO_RECOVER_PRIM; \ outb(HGC_PRIM_PORT_DATA,val); } \ IO_RECOVER_PRIM; #define HGC_PRIM_GET_REG(reg,pval) { outb(HGC_PRIM_PORT_INDEX,reg); \ IO_RECOVER_PRIM; \ *(pval)=inb(HGC_PRIM_PORT_DATA); } \ IO_RECOVER_PRIM; #define HGC_SEC_SET_REG(reg,val) { outb(HGC_SEC_PORT_INDEX,reg); \ IO_RECOVER_SEC; \ outb(HGC_SEC_PORT_DATA,val); } \ IO_RECOVER_SEC; #define HGC_SEC_GET_REG(reg,pval) { outb(HGC_SEC_PORT_INDEX,reg); \ IO_RECOVER_SEC; \ *(pval)=inb(HGC_SEC_PORT_DATA); } \ IO_RECOVER_SEC; #if 0 #define HGC_SHIFT_DISPLAY(offs) { HGC_SET_REG(45, 16 - ((offs)>>4) ) } #endif #if 0 #define HGC_SET_BANK1(b) HGC_SET_REG(HGC_REG_BANK1,b) #define HGC_SET_BANK2(b) HGC_SET_REG(HGC_REG_BANK2,b) #endif #define HGC_PROBE_REG_RW (56) #define HGC_PROBE_VAL_WRITE (0xFF) #define HGC_PROBE_VAL_READ (0xFF) #define HGC_PROBE_VAL_RESET (0x00) #define HGC_PROBE_REG_FIX (61) #define HGC_PROBE_VAL_FIX1 (16) #define HGC_PROBE_VAL_FIX2 (85) #define HGC_Graphmode (1407) static unsigned char hgcRegsGraf1280x1024[HGC_NUM_REGS] = { /*** 0 1 2 3 4 5 6 7 8 9 ***/ /*0*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*1*/ 0, 0, 0, 0, 255, 245, 0, 0, 0, 0, /*2*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*3*/ 0, 0, 214, 212, 0, 212, 1, 212, 10, 213, /*4*/ 107, 153, 138, 90, 33, 16, 191, 2, 9, 192, /*5*/ 224, 68, 65, 1, 65, 79, 0, 85, 3, 0, /*6*/ 0, 85, 3, 0 }; #define HGC_Textmode (1408) static unsigned char hgcRegsText[HGC_NUM_REGS] = { /*** 0 1 2 3 4 5 6 7 8 9 ***/ /*0*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*1*/ 12, 14, 0, 0, 7, 128, 0, 0, 0, 0, /*2*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*3*/ 0, 0, 135, 132, 135, 132, 5, 132, 200, 134, /*4*/ 107, 153, 10, 90, 36, 74, 195, 98, 13, 34, /*5*/ 28, 64, 30, 2, 27, 143, 0, 85, 3, 0, /*6*/ 0, 85, 3, 0 };