Annotation of ntddk/src/video/displays/s3/s3.h, revision 1.1.1.1

1.1       root        1: /******************************Module*Header*******************************\
                      2: * Module Name: S3.h
                      3: *
                      4: * All the S3 specific driver h file stuff
                      5: *
                      6: * Copyright (c) 1992 Microsoft Corporation
                      7: *
                      8: \**************************************************************************/
                      9: 
                     10: #define CLIPOBJ_vGetrclBounds(pco, prcl)       (*(prcl) = (pco)->rclBounds)
                     11: #define CLIPOBJ_vSetrclBounds(pco, prcl)       ((pco)->rclBounds = *(prcl))
                     12: 
                     13: #define CLIPOBJ_vGetDComplexity(pco)           (*(pco)->iDComplexity)
                     14: #define CLIPOBJ_vSetDComplexity(pco, j)        (*(pco)->iDComplexity = (j))
                     15: 
                     16: #define CLIPOBJ_fjGetClipState(pco)            ((pco)->ajPad)
                     17: #define CLIPOBJ_vSetClipState(pco, fj)         ((pco)->ajPad == (fj))
                     18: 
                     19: #define SURFOBJ_vGetpvScan0(pso, ppv)          (*(ppv) = (pso)->pvScan0)
                     20: #define SURFOBJ_vSetpvScan0(pso, pv)           ((pso)->pvScan0 = (pv))
                     21: 
                     22: 
                     23: // debug stuff
                     24: 
                     25: #if 0
                     26: 
                     27: #define LOG_OUTS    1
                     28: 
                     29: #else
                     30: 
                     31: #define CATCHIT_ON 1
                     32: #define CATCHIT (CATCHIT_ON && DBG)
                     33: 
                     34: #endif
                     35: 
                     36: // Porting stuff.
                     37: 
                     38: #if !defined(i386)
                     39: 
                     40: // The code makes extensive use of the inp, inpw, outp and outpw x86
                     41: // intrinsic functions. Since these don't exist on the Alpha platform,
                     42: // map them into something we can handle.  Since the CSRs are mapped
                     43: // on Alpha, we have to add the register base to the register number
                     44: // passed in the source.
                     45: 
                     46: #include "ioaccess.h"
                     47: 
                     48: extern PUCHAR gpucCsrBase;
                     49: 
                     50: #define inp(p)         READ_PORT_UCHAR (gpucCsrBase + (p))
                     51: #define inpw(p)                READ_PORT_USHORT ((PUSHORT)(gpucCsrBase + (p)))
                     52: #define outp(p,v)      WRITE_PORT_UCHAR (gpucCsrBase + (p), (v))
                     53: #define outpw(p,v)     WRITE_PORT_USHORT ((PUSHORT)(gpucCsrBase + (p)), (v))
                     54: 
                     55: 
                     56: #endif // !defined(i386)
                     57: 
                     58: 
                     59: #if CATCHIT
                     60: 
                     61: VOID vCheckDataReady(PPDEV);
                     62: VOID vCheckDataComplete(PPDEV);
                     63: 
                     64: #define CHECK_DATA_READY    vCheckDataReady(ppdev)
                     65: #define CHECK_DATA_COMPLETE vCheckDataComplete(ppdev)
                     66: 
                     67: VOID    outpw_test(unsigned, unsigned);
                     68: VOID    outp_test(unsigned, int);
                     69: BYTE    inp_test(WORD);
                     70: WORD    inpw_test(WORD);
                     71: 
                     72: #define OUTPW(port, val)    outpw_test(port, val)
                     73: #define OUTP(port, val)     outp_test(port, val)
                     74: #define INPW(port)         inpw_test(port)
                     75: #define INP(port)          inp_test(port)
                     76: 
                     77: #define OUTPW1(port, val)   outpw(port, val)
                     78: #define OUTP1(port, val)    outp(port, val)
                     79: #define INPW1(port)        inpw(port)
                     80: #define INP1(port)         inp(port)
                     81: 
                     82: #else
                     83: 
                     84: #define CHECK_DATA_READY
                     85: #define CHECK_DATA_COMPLETE
                     86: 
                     87: #if LOG_OUTS
                     88: 
                     89: VOID    outpw_log(unsigned, unsigned);
                     90: VOID    outp_log(unsigned, int);
                     91: 
                     92: #define OUTPW(port, val)    outpw_log(port, val)
                     93: #define OUTP(port, val)            outp_log(port, val)
                     94: #define INPW(port)         inpw(port)
                     95: #define INP(port)          inp(port)
                     96: 
                     97: #define OUTPW1(port, val)   outpw_log(port, val)
                     98: #define OUTP1(port, val)    outp_log(port, val)
                     99: #define INPW1(port)        inpw(port)
                    100: #define INP1(port)         inp(port)
                    101: 
                    102: #else
                    103: 
                    104: #define OUTPW(port, val)    outpw(port, val)
                    105: #define OUTP(port, val)            outp(port, val)
                    106: #define INPW(port)         inpw(port)
                    107: #define INP(port)          inp(port)
                    108: 
                    109: #define OUTPW1(port, val)   outpw(port, val)
                    110: #define OUTP1(port, val)    outp(port, val)
                    111: #define INPW1(port)        inpw(port)
                    112: #define INP1(port)         inp(port)
                    113: 
                    114: #endif
                    115: #endif
                    116: 
                    117: #if LOG_OUTS
                    118: 
                    119: #define TEST_928(s)                 \
                    120:     if (INP1(0x3d4) == 0xff)        \
                    121:     {                               \
                    122:         RIP(s);  \
                    123:     }
                    124: 
                    125: #else
                    126: 
                    127: #define TEST_928(s)
                    128: 
                    129: #endif
                    130: 
                    131: // S3 Chip equates.
                    132: 
                    133: #define STATUS_1            0x3DA
                    134: #define VSY_NOT             0x08
                    135: 
                    136: #define CRTC_INDEX          0x3D4
                    137: #define CRTC_DATA           0x3D5
                    138: 
                    139: #define S3R8                0x38
                    140: #define S3R9                0x39
                    141: #define S3R1                0x31
                    142: #define S3R5                0x35
                    143: 
                    144: #define CR39                0x39
                    145: #define CR4C                0x4C
                    146: #define CR4D                0x4D
                    147: 
                    148: #define HGC_MODE            0x45
                    149: #define HGC_ENABLE          0x01
                    150: #define HGC_DISABLE         0x00
                    151: 
                    152: 
                    153: #define HGC_ORGX_LSB        0x47
                    154: #define HGC_ORGX_MSB        0x46
                    155: #define HGC_ORGY_LSB        0x49
                    156: #define HGC_ORGY_MSB        0x48
                    157: 
                    158: #define HGC_DX              0x4E
                    159: #define HGC_DY              0x4F
                    160: 
                    161: 
                    162: #define REG_UNLOCK_1        0x48
                    163: #define CPUA_BASE           0X01
                    164: 
                    165: #define SYSCTL_UNLOCK       0xA0
                    166: #define SYSCTL_LOCK         0x00
                    167: 
                    168: #define SYS_CNFG            0x40
                    169: #define LAW_CTL             0x58
                    170: #define EX_SCTL_2           0x51
                    171: #define EX_DAC_CT           0x55
                    172: 
                    173: #define MISC_1              0x3A
                    174: 
                    175: // Brooktree 485 defines.
                    176: 
                    177: 
                    178:     // Registers.
                    179: 
                    180: #define BT485_ADDR_CMD_REG0        0x3c6
                    181: #define BT485_ADDR_CMD_REG1        0x3c8
                    182: #define BT485_ADDR_CMD_REG2        0x3c9
                    183: #define BT485_ADDR_CMD_REG3        0x3c6
                    184: 
                    185: 
                    186: #define BT485_CMD_REG_3_ACCESS     0x80
                    187: 
                    188: #define BT485_ADDR_CUR_COLOR_WRITE 0x3c8
                    189: #define BT485_CUR_COLOR_DATA       0x3c9
                    190: #define BT485_ADDR_CUR_RAM_WRITE   0x3c8
                    191: #define BT485_CUR_RAM_ARRAY_DATA   0X3c7
                    192: 
                    193: 
                    194: 
                    195: #define BT485_CURSOR_COLOR_1       0x1
                    196: #define BT485_CURSOR_COLOR_2       0x2
                    197: 
                    198: #define BT485_CURSOR_X_LOW         0x3c8
                    199: #define BT485_CURSOR_X_HIGH        0x3c9
                    200: 
                    201: #define BT485_CURSOR_Y_LOW         0x3c6
                    202: #define BT485_CURSOR_Y_HIGH        0x3c7
                    203: 
                    204:     // Commands.
                    205: 
                    206: #define BT485_CURSOR_DISABLE    (~0x03)
                    207: #define BT485_CURSOR_MODE2      0x02
                    208: 
                    209: #define BT485_64X64_CURSOR      0x04
                    210: 
                    211: 
                    212: // Current position & source position registers.
                    213: 
                    214: #define CUR_X               ppdev->cur_x
                    215: #define CUR_Y               ppdev->cur_y
                    216: 
                    217: // Destination register.
                    218: 
                    219: #define DEST_X              ppdev->dest_x
                    220: #define DEST_Y              ppdev->dest_y
                    221: 
                    222: #define AXSTP               ppdev->axstp
                    223: #define DIASTP              ppdev->diastp
                    224: 
                    225: #define RECT_WIDTH          ppdev->rect_width
                    226: #define LINE_MAX            ppdev->line_max
                    227: 
                    228: #define ERR_TERM            ppdev->err_term
                    229: 
                    230: // Graphic Processor status and command registers.
                    231: 
                    232: #define GP_STAT             ppdev->gp_stat
                    233: #define CMD                 ppdev->cmd
                    234: #define SHORT_STROKE_REG    ppdev->short_stroke_reg
                    235: 
                    236:     // Command Types
                    237: 
                    238: #define NOP                     0x0000
                    239: #define DRAW_LINE               0x2000
                    240: #define RECTANGLE_FILL          0x4000
                    241: #define BITBLT                  0xC000
                    242: 
                    243: #define BYTE_SWAP               0x1000
                    244: #define BUS_SIZE_16             0x0200
                    245: #define BUS_SIZE_8              0x0000
                    246: #define WAIT                    0x0100
                    247: 
                    248:     // Drawing directions (radial)
                    249: 
                    250: #define DRAWING_DIRECTION_0     0x0000
                    251: #define DRAWING_DIRECTION_45    0x0020
                    252: #define DRAWING_DIRECTION_90    0x0040
                    253: #define DRAWING_DIRECTION_135   0x0060
                    254: #define DRAWING_DIRECTION_180   0x0080
                    255: #define DRAWING_DIRECTION_225   0x00A0
                    256: #define DRAWING_DIRECTION_270   0x00C0
                    257: #define DRAWING_DIRECTION_315   0x00E0
                    258: 
                    259:     // Drawing directions (x/y)
                    260: 
                    261: #define DRAWING_DIR_BTRLXM  0x0000
                    262: #define DRAWING_DIR_BTLRXM  0x0020
                    263: #define DRAWING_DIR_BTRLYM  0x0040
                    264: #define DRAWING_DIR_BTLRYM  0x0060
                    265: #define DRAWING_DIR_TBRLXM  0x0080
                    266: #define DRAWING_DIR_TBLRXM  0x00A0
                    267: #define DRAWING_DIR_TBRLYM  0x00C0
                    268: #define DRAWING_DIR_TBLRYM  0x00E0
                    269: 
                    270:     // Drawing Direction Bits
                    271: 
                    272: #define PLUS_X              0x0020
                    273: #define PLUS_Y              0x0080
                    274: #define MAJOR_Y             0x0040
                    275: 
                    276:     // Draw
                    277: 
                    278: #define DRAW                    0x0010
                    279: 
                    280:     // Direction type
                    281: 
                    282: #define DIR_TYPE_RADIAL         0x0008
                    283: #define DIR_TYPE_XY             0x0000
                    284: 
                    285:     // Last Pixel
                    286: 
                    287: #define LAST_PIXEL_OFF          0x0004
                    288: #define LAST_PIXEL_ON           0x0000
                    289: 
                    290:     // Pixel Mode
                    291: 
                    292: #define MULTIPLE_PIXELS         0x0002
                    293: #define SINGLE_PIXEL            0x0000
                    294: 
                    295:     // Read/Write
                    296: 
                    297: #define READ                    0x0000
                    298: #define WRITE                   0x0001
                    299: 
                    300: 
                    301:     // G.P. Status
                    302: 
                    303: #define HARDWARE_BUSY       0x200
                    304: #define READ_DATA_AVAILABLE 0x100
                    305: 
                    306:     // Fifo Status
                    307: 
                    308: #define FIFO_7_STATUS       0x080
                    309: #define FIFO_6_STATUS       0x040
                    310: #define FIFO_5_STATUS       0x020
                    311: #define FIFO_4_STATUS       0x010
                    312: #define FIFO_3_STATUS       0x008
                    313: #define FIFO_2_STATUS       0x004
                    314: #define FIFO_1_STATUS       0x002
                    315: #define FIFO_0_STATUS       0x001
                    316: 
                    317:     // Fifo status in terms of empty entries
                    318: 
                    319: #define FIFO_1_EMPTY FIFO_7_STATUS
                    320: #define FIFO_2_EMPTY FIFO_6_STATUS
                    321: #define FIFO_3_EMPTY FIFO_5_STATUS
                    322: #define FIFO_4_EMPTY FIFO_4_STATUS
                    323: #define FIFO_5_EMPTY FIFO_3_STATUS
                    324: #define FIFO_6_EMPTY FIFO_2_STATUS
                    325: #define FIFO_7_EMPTY FIFO_1_STATUS
                    326: #define FIFO_8_EMPTY FIFO_0_STATUS
                    327: 
                    328: // These are the defines for the multifunction control register.
                    329: // The 4 MSBs define the function of the register.
                    330: 
                    331: #define MULTIFUNC_CNTL      ppdev->multifunc_cntl
                    332: 
                    333: #define RECT_HEIGHT         0x0000
                    334: 
                    335: #define CLIP_TOP            0x1000
                    336: #define CLIP_LEFT           0x2000
                    337: #define CLIP_BOTTOM         0x3000
                    338: #define CLIP_RIGHT          0x4000
                    339: 
                    340: #define DATA_EXTENSION      0xA000
                    341: #define ALL_ONES            0x0000
                    342: #define CPU_DATA            0x0080
                    343: #define DISPLAY_MEMORY      0x00C0
                    344: 
                    345: // Foreground & Background Color Registers.
                    346: 
                    347: #define BKGD_COLOR            ppdev->bkgd_color
                    348: #define FRGD_COLOR            ppdev->frgd_color
                    349: 
                    350: // Foreground & Background Mix register defines.
                    351: 
                    352:     // Registers
                    353: 
                    354: #define BKGD_MIX            ppdev->bkgd_mix
                    355: #define FRGD_MIX            ppdev->frgd_mix
                    356: 
                    357:     // Color source
                    358: 
                    359: #define BACKGROUND_COLOR        0x00
                    360: #define FOREGROUND_COLOR        0x20
                    361: #define SRC_CPU_DATA            0x40
                    362: #define SRC_DISPLAY_MEMORY      0x60
                    363: 
                    364:     // Mix modes
                    365: 
                    366: #define NOT_SCREEN              0x00
                    367: #define LOGICAL_0               0x01
                    368: #define LOGICAL_1               0x02
                    369: #define LEAVE_ALONE             0x03
                    370: #define NOT_NEW                 0x04
                    371: #define SCREEN_XOR_NEW          0x05
                    372: #define NOT_SCREEN_XOR_NEW      0x06
                    373: #define OVERPAINT               0x07
                    374: #define NOT_SCREEN_OR_NOT_NEW   0x08
                    375: #define SCREEN_OR_NOT_NEW       0x09
                    376: #define NOT_SCREEN_OR_NEW       0x0A
                    377: #define SCREEN_OR_NEW           0x0B
                    378: #define SCREEN_AND_NEW          0x0C
                    379: #define NOT_SCREEN_AND_NEW      0x0D
                    380: #define SCREEN_AND_NOT_NEW      0x0E
                    381: #define NOT_SCREEN_AND_NOT_NEW  0x0F
                    382: 
                    383: // Read and write masks
                    384: 
                    385: #define WRT_MASK                ppdev->wrt_mask
                    386: #define RD_MASK                 ppdev->rd_mask
                    387: 
                    388: // Data port
                    389: 
                    390: #define PIXEL_TRANSFER          ppdev->pixel_transfer
                    391: 
                    392: // General purpose support routines & macros.
                    393: 
                    394: #define FIFOWAIT(level) while (INPW(GP_STAT) & level);
                    395: 
                    396: #define GPWAIT() while (INPW(GP_STAT) & HARDWARE_BUSY);
                    397: 
                    398: // 801/805/928 specific macros.
                    399: 
                    400: #define ENABLE_DIRECT_ACCESS                            \
                    401:     if (ppdev->bNewBankControl)                         \
                    402:     {                                                   \
                    403:         TEST_928 ("S3.DLL!pre enable direct access 928 failure\n"); \
                    404:         while (inpw(GP_STAT) & 0x200);                  \
                    405:         OUTPW1(CRTC_INDEX, (ppdev->SysCnfg | 0x0800));   \
                    406:         OUTPW1(CRTC_INDEX, (ppdev->LawCtl  | 0x1000));   \
                    407:         TEST_928 ("S3.DLL!post enable direct access 928 failure\n");\
                    408:     }
                    409: 
                    410: 
                    411: #define ENABLE_S3_ENGINE                                \
                    412:     if (ppdev->bNewBankControl)                         \
                    413:     {                                                   \
                    414:         TEST_928 ("S3.DLL!pre enable S3 engine 928 failure\n");     \
                    415:         OUTPW1(CRTC_INDEX, ppdev->LawCtl);               \
                    416:         OUTPW1(CRTC_INDEX, (ppdev->SysCnfg | 0x0100));   \
                    417:         TEST_928 ("S3.DLL!post enable S3 engine 928 failure\n");    \
                    418:     }
                    419: 
                    420: VOID vSetS3ClipRect(PPDEV ppdev, PRECTL prclClip);
                    421: VOID vResetS3Clipping(PPDEV ppdev);
                    422: 
                    423: VOID vDataPortOut (PPDEV ppdev, PWORD pw, UINT count);
                    424: VOID vDataPortOutB(PPDEV ppdev, PBYTE pb, UINT count);
                    425: VOID vDataPortIn  (PPDEV ppdev, PWORD pw, UINT count);
                    426: VOID vDataPortInB (PPDEV ppdev, PBYTE pb, UINT count);
                    427: 
                    428: // Shadow macros
                    429: 
                    430: #define TEST_AND_SET_FRGD_MIX(val)              \
                    431:             if (val != ppdev->ForegroundMix)    \
                    432:             {                                   \
                    433:                 ppdev->ForegroundMix = val;     \
                    434:                 OUTPW(FRGD_MIX, val);           \
                    435:             }
                    436: 
                    437: #define TEST_AND_SET_BKGD_MIX(val)              \
                    438:             if (val != ppdev->BackgroundMix)    \
                    439:             {                                   \
                    440:                 ppdev->BackgroundMix = val;     \
                    441:                 OUTPW(BKGD_MIX, val);           \
                    442:             }
                    443: 
                    444: #define TEST_AND_SET_FRGD_COLOR(val)            \
                    445:             if (val != ppdev->ForegroundColor)  \
                    446:             {                                   \
                    447:                 ppdev->ForegroundColor = val;   \
                    448:                 OUTPW(FRGD_COLOR, val);         \
                    449:             }
                    450: 
                    451: #define TEST_AND_SET_BKGD_COLOR(val)            \
                    452:             if (val != ppdev->BackgroundColor)  \
                    453:             {                                   \
                    454:                 ppdev->BackgroundColor = val;   \
                    455:                 OUTPW(BKGD_COLOR, val);         \
                    456:             }
                    457: 
                    458: #define TEST_AND_SET_WRT_MASK(val)              \
                    459:             if (val != ppdev->WriteMask)        \
                    460:             {                                   \
                    461:                 ppdev->WriteMask = val;         \
                    462:                 OUTPW(WRT_MASK, val);           \
                    463:             }
                    464: 
                    465: #define TEST_AND_SET_RD_MASK(val)               \
                    466:             if (val != ppdev->ReadMask)         \
                    467:             {                                   \
                    468:                 ppdev->ReadMask = val;          \
                    469:                 OUTPW(RD_MASK, val);            \
                    470:             }
                    471: 
                    472: #define SET_FRGD_MIX(val)                       \
                    473:             {                                   \
                    474:                 ppdev->ForegroundMix = val;     \
                    475:                 OUTPW(FRGD_MIX, val);           \
                    476:             }
                    477: 
                    478: #define SET_BKGD_MIX(val)                       \
                    479:             {                                   \
                    480:                 ppdev->BackgroundMix = val;     \
                    481:                 OUTPW(BKGD_MIX, val);           \
                    482:             }
                    483: 
                    484: #define SET_FRGD_COLOR(val)                     \
                    485:             {                                   \
                    486:                 ppdev->ForegroundColor = val;   \
                    487:                 OUTPW(FRGD_COLOR, val);         \
                    488:             }
                    489: 
                    490: #define SET_BKGD_COLOR(val)                     \
                    491:             {                                   \
                    492:                 ppdev->BackgroundColor = val;   \
                    493:                 OUTPW(BKGD_COLOR, val);         \
                    494:             }
                    495: 
                    496: #define SET_WRT_MASK(val)                       \
                    497:             {                                   \
                    498:                 ppdev->WriteMask = val;         \
                    499:                 OUTPW(WRT_MASK, val);           \
                    500:             }
                    501: 
                    502: #define SET_RD_MASK(val)                        \
                    503:             {                                   \
                    504:                 ppdev->ReadMask = val;          \
                    505:                 OUTPW(RD_MASK, val);            \
                    506:             }
                    507: 
                    508: 
                    509: 
                    510: #define SCRN_TO_SCRN_CPY    0x01
                    511: #define SOLID_PATTERN       0x02
                    512: #define BRUSH_PATTERN       0x04
                    513: #define BLACK_AND_WHITE     0x08
                    514: #define HOST_TO_SCRN_CPY    0x10
                    515: 
                    516: // Clipping Control Stuff
                    517: 
                    518: typedef struct {
                    519:     ULONG   c;
                    520:     RECTL   arcl[8];
                    521: } ENUMRECTS8;
                    522: 
                    523: typedef ENUMRECTS8 *PENUMRECTS8;
                    524: 
                    525: typedef struct {
                    526:     ULONG       c;
                    527:     TRAPEZOID   atrap[8];
                    528: } ENUMTRAPS8;
                    529: 
                    530: typedef ENUMTRAPS8 *PENUMTRAPS8;
                    531: 
                    532: #define MAX_DDA_RECTS   40  // most rects we want enumerated by DDAOBJ at once
                    533: 
                    534: typedef struct _DDAENUM
                    535: {
                    536:     LONG    yTop;
                    537:     LONG    yBottom;
                    538:     LONG    axPairs[MAX_DDA_RECTS];
                    539: } DDAENUM;
                    540: 
                    541: BOOL bIntersectTest(PRECTL prcl1, PRECTL prcl2);
                    542: BOOL bTrivialAcceptTest(PRECTL prcl1, PRECTL prcl2);
                    543: 
                    544: // ROP translation stuff.
                    545: 
                    546: extern BYTE Rop2ToS3Rop[];
                    547: 
                    548: // Full screen support stuff
                    549: 
                    550: VOID vSaveOffScreenMemory(PPDEV);
                    551: VOID vRestoreOffScreenMemory(PPDEV);
                    552: 
                    553: // SaveScreenBits and source bitmap cache stuff.
                    554: 
                    555: BOOL bMoveSaveScreenBitsToHost(PPDEV ppdev, PSAVEDSCRNBITS *ppssbNewNode);
                    556: 
                    557: // Hooks and Driver function table.
                    558: 
                    559: #define HOOKS_BMF8BPP   (HOOK_BITBLT     | HOOK_TEXTOUT     | HOOK_FILLPATH | \
                    560:                          HOOK_COPYBITS   | HOOK_STROKEPATH  | HOOK_PAINT)
                    561: 
                    562: #define HOOKS_BMF16BPP 0

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.