Annotation of qemu/roms/seabios/vgasrc/stdvgamodes.c, revision 1.1.1.1

1.1       root        1: // Standard VGA mode information.
                      2: //
                      3: // Copyright (C) 2009  Kevin O'Connor <[email protected]>
                      4: // Copyright (C) 2001-2008 the LGPL VGABios developers Team
                      5: //
                      6: // This file may be distributed under the terms of the GNU LGPLv3 license.
                      7: 
                      8: #include "vgabios.h" // struct VideoParamTableEntry_s
                      9: #include "biosvar.h" // GET_GLOBAL
                     10: #include "util.h" // memcpy_far
                     11: #include "stdvga.h" // stdvga_find_mode
                     12: 
                     13: 
                     14: /****************************************************************
                     15:  * Video mode register definitions
                     16:  ****************************************************************/
                     17: 
                     18: /* Mono */
                     19: static u8 palette0[] VAR16 = {
                     20:   0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00,
                     21:   0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00,
                     22:   0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a,
                     23:   0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a,
                     24:   0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a,
                     25:   0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a,
                     26:   0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f,
                     27:   0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f,
                     28:   0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00,
                     29:   0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00,
                     30:   0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a,
                     31:   0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a,
                     32:   0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a,
                     33:   0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a,
                     34:   0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f,
                     35:   0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f
                     36: };
                     37: 
                     38: static u8 palette1[] VAR16 = {
                     39:   0x00,0x00,0x00, 0x00,0x00,0x2a, 0x00,0x2a,0x00, 0x00,0x2a,0x2a,
                     40:   0x2a,0x00,0x00, 0x2a,0x00,0x2a, 0x2a,0x15,0x00, 0x2a,0x2a,0x2a,
                     41:   0x00,0x00,0x00, 0x00,0x00,0x2a, 0x00,0x2a,0x00, 0x00,0x2a,0x2a,
                     42:   0x2a,0x00,0x00, 0x2a,0x00,0x2a, 0x2a,0x15,0x00, 0x2a,0x2a,0x2a,
                     43:   0x15,0x15,0x15, 0x15,0x15,0x3f, 0x15,0x3f,0x15, 0x15,0x3f,0x3f,
                     44:   0x3f,0x15,0x15, 0x3f,0x15,0x3f, 0x3f,0x3f,0x15, 0x3f,0x3f,0x3f,
                     45:   0x15,0x15,0x15, 0x15,0x15,0x3f, 0x15,0x3f,0x15, 0x15,0x3f,0x3f,
                     46:   0x3f,0x15,0x15, 0x3f,0x15,0x3f, 0x3f,0x3f,0x15, 0x3f,0x3f,0x3f,
                     47:   0x00,0x00,0x00, 0x00,0x00,0x2a, 0x00,0x2a,0x00, 0x00,0x2a,0x2a,
                     48:   0x2a,0x00,0x00, 0x2a,0x00,0x2a, 0x2a,0x15,0x00, 0x2a,0x2a,0x2a,
                     49:   0x00,0x00,0x00, 0x00,0x00,0x2a, 0x00,0x2a,0x00, 0x00,0x2a,0x2a,
                     50:   0x2a,0x00,0x00, 0x2a,0x00,0x2a, 0x2a,0x15,0x00, 0x2a,0x2a,0x2a,
                     51:   0x15,0x15,0x15, 0x15,0x15,0x3f, 0x15,0x3f,0x15, 0x15,0x3f,0x3f,
                     52:   0x3f,0x15,0x15, 0x3f,0x15,0x3f, 0x3f,0x3f,0x15, 0x3f,0x3f,0x3f,
                     53:   0x15,0x15,0x15, 0x15,0x15,0x3f, 0x15,0x3f,0x15, 0x15,0x3f,0x3f,
                     54:   0x3f,0x15,0x15, 0x3f,0x15,0x3f, 0x3f,0x3f,0x15, 0x3f,0x3f,0x3f
                     55: };
                     56: 
                     57: static u8 palette2[] VAR16 = {
                     58:   0x00,0x00,0x00, 0x00,0x00,0x2a, 0x00,0x2a,0x00, 0x00,0x2a,0x2a,
                     59:   0x2a,0x00,0x00, 0x2a,0x00,0x2a, 0x2a,0x2a,0x00, 0x2a,0x2a,0x2a,
                     60:   0x00,0x00,0x15, 0x00,0x00,0x3f, 0x00,0x2a,0x15, 0x00,0x2a,0x3f,
                     61:   0x2a,0x00,0x15, 0x2a,0x00,0x3f, 0x2a,0x2a,0x15, 0x2a,0x2a,0x3f,
                     62:   0x00,0x15,0x00, 0x00,0x15,0x2a, 0x00,0x3f,0x00, 0x00,0x3f,0x2a,
                     63:   0x2a,0x15,0x00, 0x2a,0x15,0x2a, 0x2a,0x3f,0x00, 0x2a,0x3f,0x2a,
                     64:   0x00,0x15,0x15, 0x00,0x15,0x3f, 0x00,0x3f,0x15, 0x00,0x3f,0x3f,
                     65:   0x2a,0x15,0x15, 0x2a,0x15,0x3f, 0x2a,0x3f,0x15, 0x2a,0x3f,0x3f,
                     66:   0x15,0x00,0x00, 0x15,0x00,0x2a, 0x15,0x2a,0x00, 0x15,0x2a,0x2a,
                     67:   0x3f,0x00,0x00, 0x3f,0x00,0x2a, 0x3f,0x2a,0x00, 0x3f,0x2a,0x2a,
                     68:   0x15,0x00,0x15, 0x15,0x00,0x3f, 0x15,0x2a,0x15, 0x15,0x2a,0x3f,
                     69:   0x3f,0x00,0x15, 0x3f,0x00,0x3f, 0x3f,0x2a,0x15, 0x3f,0x2a,0x3f,
                     70:   0x15,0x15,0x00, 0x15,0x15,0x2a, 0x15,0x3f,0x00, 0x15,0x3f,0x2a,
                     71:   0x3f,0x15,0x00, 0x3f,0x15,0x2a, 0x3f,0x3f,0x00, 0x3f,0x3f,0x2a,
                     72:   0x15,0x15,0x15, 0x15,0x15,0x3f, 0x15,0x3f,0x15, 0x15,0x3f,0x3f,
                     73:   0x3f,0x15,0x15, 0x3f,0x15,0x3f, 0x3f,0x3f,0x15, 0x3f,0x3f,0x3f
                     74: };
                     75: 
                     76: static u8 palette3[] VAR16 = {
                     77:   0x00,0x00,0x00, 0x00,0x00,0x2a, 0x00,0x2a,0x00, 0x00,0x2a,0x2a,
                     78:   0x2a,0x00,0x00, 0x2a,0x00,0x2a, 0x2a,0x15,0x00, 0x2a,0x2a,0x2a,
                     79:   0x15,0x15,0x15, 0x15,0x15,0x3f, 0x15,0x3f,0x15, 0x15,0x3f,0x3f,
                     80:   0x3f,0x15,0x15, 0x3f,0x15,0x3f, 0x3f,0x3f,0x15, 0x3f,0x3f,0x3f,
                     81:   0x00,0x00,0x00, 0x05,0x05,0x05, 0x08,0x08,0x08, 0x0b,0x0b,0x0b,
                     82:   0x0e,0x0e,0x0e, 0x11,0x11,0x11, 0x14,0x14,0x14, 0x18,0x18,0x18,
                     83:   0x1c,0x1c,0x1c, 0x20,0x20,0x20, 0x24,0x24,0x24, 0x28,0x28,0x28,
                     84:   0x2d,0x2d,0x2d, 0x32,0x32,0x32, 0x38,0x38,0x38, 0x3f,0x3f,0x3f,
                     85:   0x00,0x00,0x3f, 0x10,0x00,0x3f, 0x1f,0x00,0x3f, 0x2f,0x00,0x3f,
                     86:   0x3f,0x00,0x3f, 0x3f,0x00,0x2f, 0x3f,0x00,0x1f, 0x3f,0x00,0x10,
                     87:   0x3f,0x00,0x00, 0x3f,0x10,0x00, 0x3f,0x1f,0x00, 0x3f,0x2f,0x00,
                     88:   0x3f,0x3f,0x00, 0x2f,0x3f,0x00, 0x1f,0x3f,0x00, 0x10,0x3f,0x00,
                     89:   0x00,0x3f,0x00, 0x00,0x3f,0x10, 0x00,0x3f,0x1f, 0x00,0x3f,0x2f,
                     90:   0x00,0x3f,0x3f, 0x00,0x2f,0x3f, 0x00,0x1f,0x3f, 0x00,0x10,0x3f,
                     91:   0x1f,0x1f,0x3f, 0x27,0x1f,0x3f, 0x2f,0x1f,0x3f, 0x37,0x1f,0x3f,
                     92:   0x3f,0x1f,0x3f, 0x3f,0x1f,0x37, 0x3f,0x1f,0x2f, 0x3f,0x1f,0x27,
                     93: 
                     94:   0x3f,0x1f,0x1f, 0x3f,0x27,0x1f, 0x3f,0x2f,0x1f, 0x3f,0x37,0x1f,
                     95:   0x3f,0x3f,0x1f, 0x37,0x3f,0x1f, 0x2f,0x3f,0x1f, 0x27,0x3f,0x1f,
                     96:   0x1f,0x3f,0x1f, 0x1f,0x3f,0x27, 0x1f,0x3f,0x2f, 0x1f,0x3f,0x37,
                     97:   0x1f,0x3f,0x3f, 0x1f,0x37,0x3f, 0x1f,0x2f,0x3f, 0x1f,0x27,0x3f,
                     98:   0x2d,0x2d,0x3f, 0x31,0x2d,0x3f, 0x36,0x2d,0x3f, 0x3a,0x2d,0x3f,
                     99:   0x3f,0x2d,0x3f, 0x3f,0x2d,0x3a, 0x3f,0x2d,0x36, 0x3f,0x2d,0x31,
                    100:   0x3f,0x2d,0x2d, 0x3f,0x31,0x2d, 0x3f,0x36,0x2d, 0x3f,0x3a,0x2d,
                    101:   0x3f,0x3f,0x2d, 0x3a,0x3f,0x2d, 0x36,0x3f,0x2d, 0x31,0x3f,0x2d,
                    102:   0x2d,0x3f,0x2d, 0x2d,0x3f,0x31, 0x2d,0x3f,0x36, 0x2d,0x3f,0x3a,
                    103:   0x2d,0x3f,0x3f, 0x2d,0x3a,0x3f, 0x2d,0x36,0x3f, 0x2d,0x31,0x3f,
                    104:   0x00,0x00,0x1c, 0x07,0x00,0x1c, 0x0e,0x00,0x1c, 0x15,0x00,0x1c,
                    105:   0x1c,0x00,0x1c, 0x1c,0x00,0x15, 0x1c,0x00,0x0e, 0x1c,0x00,0x07,
                    106:   0x1c,0x00,0x00, 0x1c,0x07,0x00, 0x1c,0x0e,0x00, 0x1c,0x15,0x00,
                    107:   0x1c,0x1c,0x00, 0x15,0x1c,0x00, 0x0e,0x1c,0x00, 0x07,0x1c,0x00,
                    108:   0x00,0x1c,0x00, 0x00,0x1c,0x07, 0x00,0x1c,0x0e, 0x00,0x1c,0x15,
                    109:   0x00,0x1c,0x1c, 0x00,0x15,0x1c, 0x00,0x0e,0x1c, 0x00,0x07,0x1c,
                    110: 
                    111:   0x0e,0x0e,0x1c, 0x11,0x0e,0x1c, 0x15,0x0e,0x1c, 0x18,0x0e,0x1c,
                    112:   0x1c,0x0e,0x1c, 0x1c,0x0e,0x18, 0x1c,0x0e,0x15, 0x1c,0x0e,0x11,
                    113:   0x1c,0x0e,0x0e, 0x1c,0x11,0x0e, 0x1c,0x15,0x0e, 0x1c,0x18,0x0e,
                    114:   0x1c,0x1c,0x0e, 0x18,0x1c,0x0e, 0x15,0x1c,0x0e, 0x11,0x1c,0x0e,
                    115:   0x0e,0x1c,0x0e, 0x0e,0x1c,0x11, 0x0e,0x1c,0x15, 0x0e,0x1c,0x18,
                    116:   0x0e,0x1c,0x1c, 0x0e,0x18,0x1c, 0x0e,0x15,0x1c, 0x0e,0x11,0x1c,
                    117:   0x14,0x14,0x1c, 0x16,0x14,0x1c, 0x18,0x14,0x1c, 0x1a,0x14,0x1c,
                    118:   0x1c,0x14,0x1c, 0x1c,0x14,0x1a, 0x1c,0x14,0x18, 0x1c,0x14,0x16,
                    119:   0x1c,0x14,0x14, 0x1c,0x16,0x14, 0x1c,0x18,0x14, 0x1c,0x1a,0x14,
                    120:   0x1c,0x1c,0x14, 0x1a,0x1c,0x14, 0x18,0x1c,0x14, 0x16,0x1c,0x14,
                    121:   0x14,0x1c,0x14, 0x14,0x1c,0x16, 0x14,0x1c,0x18, 0x14,0x1c,0x1a,
                    122:   0x14,0x1c,0x1c, 0x14,0x1a,0x1c, 0x14,0x18,0x1c, 0x14,0x16,0x1c,
                    123:   0x00,0x00,0x10, 0x04,0x00,0x10, 0x08,0x00,0x10, 0x0c,0x00,0x10,
                    124:   0x10,0x00,0x10, 0x10,0x00,0x0c, 0x10,0x00,0x08, 0x10,0x00,0x04,
                    125:   0x10,0x00,0x00, 0x10,0x04,0x00, 0x10,0x08,0x00, 0x10,0x0c,0x00,
                    126:   0x10,0x10,0x00, 0x0c,0x10,0x00, 0x08,0x10,0x00, 0x04,0x10,0x00,
                    127: 
                    128:   0x00,0x10,0x00, 0x00,0x10,0x04, 0x00,0x10,0x08, 0x00,0x10,0x0c,
                    129:   0x00,0x10,0x10, 0x00,0x0c,0x10, 0x00,0x08,0x10, 0x00,0x04,0x10,
                    130:   0x08,0x08,0x10, 0x0a,0x08,0x10, 0x0c,0x08,0x10, 0x0e,0x08,0x10,
                    131:   0x10,0x08,0x10, 0x10,0x08,0x0e, 0x10,0x08,0x0c, 0x10,0x08,0x0a,
                    132:   0x10,0x08,0x08, 0x10,0x0a,0x08, 0x10,0x0c,0x08, 0x10,0x0e,0x08,
                    133:   0x10,0x10,0x08, 0x0e,0x10,0x08, 0x0c,0x10,0x08, 0x0a,0x10,0x08,
                    134:   0x08,0x10,0x08, 0x08,0x10,0x0a, 0x08,0x10,0x0c, 0x08,0x10,0x0e,
                    135:   0x08,0x10,0x10, 0x08,0x0e,0x10, 0x08,0x0c,0x10, 0x08,0x0a,0x10,
                    136:   0x0b,0x0b,0x10, 0x0c,0x0b,0x10, 0x0d,0x0b,0x10, 0x0f,0x0b,0x10,
                    137:   0x10,0x0b,0x10, 0x10,0x0b,0x0f, 0x10,0x0b,0x0d, 0x10,0x0b,0x0c,
                    138:   0x10,0x0b,0x0b, 0x10,0x0c,0x0b, 0x10,0x0d,0x0b, 0x10,0x0f,0x0b,
                    139:   0x10,0x10,0x0b, 0x0f,0x10,0x0b, 0x0d,0x10,0x0b, 0x0c,0x10,0x0b,
                    140:   0x0b,0x10,0x0b, 0x0b,0x10,0x0c, 0x0b,0x10,0x0d, 0x0b,0x10,0x0f,
                    141:   0x0b,0x10,0x10, 0x0b,0x0f,0x10, 0x0b,0x0d,0x10, 0x0b,0x0c,0x10,
                    142:   0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00,
                    143:   0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00
                    144: };
                    145: 
                    146: static u8 sequ_01[] VAR16 = { 0x08, 0x03, 0x00, 0x02 };
                    147: static u8 crtc_01[] VAR16 = {
                    148:     0x2d, 0x27, 0x28, 0x90, 0x2b, 0xa0, 0xbf, 0x1f,
                    149:     0x00, 0x4f, 0x0d, 0x0e, 0x00, 0x00, 0x00, 0x00,
                    150:     0x9c, 0x8e, 0x8f, 0x14, 0x1f, 0x96, 0xb9, 0xa3,
                    151:     0xff };
                    152: static u8 actl_01[] VAR16 = {
                    153:     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07,
                    154:     0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
                    155:     0x0c, 0x00, 0x0f, 0x08 };
                    156: static u8 grdc_01[] VAR16 = {
                    157:     0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0e, 0x0f, 0xff };
                    158: static u8 sequ_03[] VAR16 = { 0x00, 0x03, 0x00, 0x02 };
                    159: static u8 crtc_03[] VAR16 = {
                    160:     0x5f, 0x4f, 0x50, 0x82, 0x55, 0x81, 0xbf, 0x1f,
                    161:     0x00, 0x4f, 0x0d, 0x0e, 0x00, 0x00, 0x00, 0x00,
                    162:     0x9c, 0x8e, 0x8f, 0x28, 0x1f, 0x96, 0xb9, 0xa3,
                    163:     0xff };
                    164: static u8 sequ_04[] VAR16 = { 0x09, 0x03, 0x00, 0x02 };
                    165: static u8 crtc_04[] VAR16 = {
                    166:     0x2d, 0x27, 0x28, 0x90, 0x2b, 0x80, 0xbf, 0x1f,
                    167:     0x00, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                    168:     0x9c, 0x8e, 0x8f, 0x14, 0x00, 0x96, 0xb9, 0xa2,
                    169:     0xff };
                    170: static u8 actl_04[] VAR16 = {
                    171:     0x00, 0x13, 0x15, 0x17, 0x02, 0x04, 0x06, 0x07,
                    172:     0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
                    173:     0x01, 0x00, 0x03, 0x00 };
                    174: static u8 grdc_04[] VAR16 = {
                    175:     0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0f, 0x0f, 0xff };
                    176: static u8 sequ_06[] VAR16 = { 0x01, 0x01, 0x00, 0x06 };
                    177: static u8 crtc_06[] VAR16 = {
                    178:     0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80, 0xbf, 0x1f,
                    179:     0x00, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                    180:     0x9c, 0x8e, 0x8f, 0x28, 0x00, 0x96, 0xb9, 0xc2,
                    181:     0xff };
                    182: static u8 actl_06[] VAR16 = {
                    183:     0x00, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17,
                    184:     0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17,
                    185:     0x01, 0x00, 0x01, 0x00 };
                    186: static u8 grdc_06[] VAR16 = {
                    187:     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x0f, 0xff };
                    188: static u8 crtc_07[] VAR16 = {
                    189:     0x5f, 0x4f, 0x50, 0x82, 0x55, 0x81, 0xbf, 0x1f,
                    190:     0x00, 0x4f, 0x0d, 0x0e, 0x00, 0x00, 0x00, 0x00,
                    191:     0x9c, 0x8e, 0x8f, 0x28, 0x0f, 0x96, 0xb9, 0xa3,
                    192:     0xff };
                    193: static u8 actl_07[] VAR16 = {
                    194:     0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
                    195:     0x10, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
                    196:     0x0e, 0x00, 0x0f, 0x08 };
                    197: static u8 grdc_07[] VAR16 = {
                    198:     0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0a, 0x0f, 0xff };
                    199: static u8 sequ_0d[] VAR16 = { 0x09, 0x0f, 0x00, 0x06 };
                    200: static u8 crtc_0d[] VAR16 = {
                    201:     0x2d, 0x27, 0x28, 0x90, 0x2b, 0x80, 0xbf, 0x1f,
                    202:     0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                    203:     0x9c, 0x8e, 0x8f, 0x14, 0x00, 0x96, 0xb9, 0xe3,
                    204:     0xff };
                    205: static u8 actl_0d[] VAR16 = {
                    206:     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
                    207:     0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
                    208:     0x01, 0x00, 0x0f, 0x00 };
                    209: static u8 grdc_0d[] VAR16 = {
                    210:     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0f, 0xff };
                    211: static u8 sequ_0e[] VAR16 = { 0x01, 0x0f, 0x00, 0x06 };
                    212: static u8 crtc_0e[] VAR16 = {
                    213:     0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80, 0xbf, 0x1f,
                    214:     0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                    215:     0x9c, 0x8e, 0x8f, 0x28, 0x00, 0x96, 0xb9, 0xe3,
                    216:     0xff };
                    217: static u8 crtc_0f[] VAR16 = {
                    218:     0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80, 0xbf, 0x1f,
                    219:     0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                    220:     0x83, 0x85, 0x5d, 0x28, 0x0f, 0x63, 0xba, 0xe3,
                    221:     0xff };
                    222: static u8 actl_0f[] VAR16 = {
                    223:     0x00, 0x08, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
                    224:     0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00,
                    225:     0x01, 0x00, 0x01, 0x00 };
                    226: static u8 actl_10[] VAR16 = {
                    227:     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07,
                    228:     0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
                    229:     0x01, 0x00, 0x0f, 0x00 };
                    230: static u8 crtc_11[] VAR16 = {
                    231:     0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80, 0x0b, 0x3e,
                    232:     0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                    233:     0xea, 0x8c, 0xdf, 0x28, 0x00, 0xe7, 0x04, 0xe3,
                    234:     0xff };
                    235: static u8 actl_11[] VAR16 = {
                    236:     0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f,
                    237:     0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3f,
                    238:     0x01, 0x00, 0x0f, 0x00 };
                    239: static u8 sequ_13[] VAR16 = { 0x01, 0x0f, 0x00, 0x0e };
                    240: static u8 crtc_13[] VAR16 = {
                    241:     0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80, 0xbf, 0x1f,
                    242:     0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                    243:     0x9c, 0x8e, 0x8f, 0x28, 0x40, 0x96, 0xb9, 0xa3,
                    244:     0xff };
                    245: static u8 actl_13[] VAR16 = {
                    246:     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
                    247:     0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
                    248:     0x41, 0x00, 0x0f, 0x00 };
                    249: static u8 grdc_13[] VAR16 = {
                    250:     0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0f, 0xff };
                    251: static u8 crtc_6A[] VAR16 = {
                    252:     0x7f, 0x63, 0x63, 0x83, 0x6b, 0x1b, 0x72, 0xf0,
                    253:     0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                    254:     0x59, 0x8d, 0x57, 0x32, 0x00, 0x57, 0x73, 0xe3,
                    255:     0xff };
                    256: 
                    257: #define PAL(x) x, sizeof(x)
                    258: 
                    259: struct stdvga_mode_s {
                    260:     u16 mode;
                    261:     struct vgamode_s info;
                    262: 
                    263:     u8 pelmask;
                    264:     u8 *dac;
                    265:     u16 dacsize;
                    266:     u8 *sequ_regs;
                    267:     u8 miscreg;
                    268:     u8 *crtc_regs;
                    269:     u8 *actl_regs;
                    270:     u8 *grdc_regs;
                    271: };
                    272: 
                    273: static struct stdvga_mode_s vga_modes[] VAR16 = {
                    274:     //mode { model       tx   ty bpp cw ch  sstart    }
                    275:     // pelm  dac            sequ     misc  crtc     actl     grdc
                    276:     {0x00, { MM_TEXT,    40,  25, 4, 9, 16, SEG_CTEXT }
                    277:      , 0xFF, PAL(palette2), sequ_01, 0x67, crtc_01, actl_01, grdc_01},
                    278:     {0x01, { MM_TEXT,    40,  25, 4, 9, 16, SEG_CTEXT }
                    279:      , 0xFF, PAL(palette2), sequ_01, 0x67, crtc_01, actl_01, grdc_01},
                    280:     {0x02, { MM_TEXT,    80,  25, 4, 9, 16, SEG_CTEXT }
                    281:      , 0xFF, PAL(palette2), sequ_03, 0x67, crtc_03, actl_01, grdc_01},
                    282:     {0x03, { MM_TEXT,    80,  25, 4, 9, 16, SEG_CTEXT }
                    283:      , 0xFF, PAL(palette2), sequ_03, 0x67, crtc_03, actl_01, grdc_01},
                    284:     {0x04, { MM_CGA,    320, 200, 2, 8,  8, SEG_CTEXT }
                    285:      , 0xFF, PAL(palette1), sequ_04, 0x63, crtc_04, actl_04, grdc_04},
                    286:     {0x05, { MM_CGA,    320, 200, 2, 8,  8, SEG_CTEXT }
                    287:      , 0xFF, PAL(palette1), sequ_04, 0x63, crtc_04, actl_04, grdc_04},
                    288:     {0x06, { MM_CGA,    640, 200, 1, 8,  8, SEG_CTEXT }
                    289:      , 0xFF, PAL(palette1), sequ_06, 0x63, crtc_06, actl_06, grdc_06},
                    290:     {0x07, { MM_TEXT,    80,  25, 4, 9, 16, SEG_MTEXT }
                    291:      , 0xFF, PAL(palette0), sequ_03, 0x66, crtc_07, actl_07, grdc_07},
                    292:     {0x0D, { MM_PLANAR, 320, 200, 4, 8,  8, SEG_GRAPH }
                    293:      , 0xFF, PAL(palette1), sequ_0d, 0x63, crtc_0d, actl_0d, grdc_0d},
                    294:     {0x0E, { MM_PLANAR, 640, 200, 4, 8,  8, SEG_GRAPH }
                    295:      , 0xFF, PAL(palette1), sequ_0e, 0x63, crtc_0e, actl_0d, grdc_0d},
                    296:     {0x0F, { MM_PLANAR, 640, 350, 1, 8, 14, SEG_GRAPH }
                    297:      , 0xFF, PAL(palette0), sequ_0e, 0xa3, crtc_0f, actl_0f, grdc_0d},
                    298:     {0x10, { MM_PLANAR, 640, 350, 4, 8, 14, SEG_GRAPH }
                    299:      , 0xFF, PAL(palette2), sequ_0e, 0xa3, crtc_0f, actl_10, grdc_0d},
                    300:     {0x11, { MM_PLANAR, 640, 480, 1, 8, 16, SEG_GRAPH }
                    301:      , 0xFF, PAL(palette2), sequ_0e, 0xe3, crtc_11, actl_11, grdc_0d},
                    302:     {0x12, { MM_PLANAR, 640, 480, 4, 8, 16, SEG_GRAPH }
                    303:      , 0xFF, PAL(palette2), sequ_0e, 0xe3, crtc_11, actl_10, grdc_0d},
                    304:     {0x13, { MM_PACKED, 320, 200, 8, 8,  8, SEG_GRAPH }
                    305:      , 0xFF, PAL(palette3), sequ_13, 0x63, crtc_13, actl_13, grdc_13},
                    306:     {0x6A, { MM_PLANAR, 800, 600, 4, 8, 16, SEG_GRAPH }
                    307:      , 0xFF, PAL(palette2), sequ_0e, 0xe3, crtc_6A, actl_10, grdc_0d},
                    308: };
                    309: 
                    310: 
                    311: /****************************************************************
                    312:  * Mode functions
                    313:  ****************************************************************/
                    314: 
                    315: static int
                    316: is_stdvga_mode(struct vgamode_s *vmode_g)
                    317: {
                    318:     return (vmode_g >= &vga_modes[0].info
                    319:             && vmode_g <= &vga_modes[ARRAY_SIZE(vga_modes)-1].info);
                    320: }
                    321: 
                    322: struct vgamode_s *
                    323: stdvga_find_mode(int mode)
                    324: {
                    325:     int i;
                    326:     for (i = 0; i < ARRAY_SIZE(vga_modes); i++) {
                    327:         struct stdvga_mode_s *stdmode_g = &vga_modes[i];
                    328:         if (GET_GLOBAL(stdmode_g->mode) == mode)
                    329:             return &stdmode_g->info;
                    330:     }
                    331:     return NULL;
                    332: }
                    333: 
                    334: void
                    335: stdvga_list_modes(u16 seg, u16 *dest, u16 *last)
                    336: {
                    337:     SET_FARVAR(seg, *dest, 0xffff);
                    338: }
                    339: 
                    340: void
                    341: stdvga_build_video_param(void)
                    342: {
                    343:     static u8 parammodes[] VAR16 = {
                    344:         0, 0, 0, 0, 0x04, 0x05, 0x06, 0x07,
                    345:         0, 0, 0, 0, 0, 0x0d, 0x0e, 0,
                    346:         0, 0x0f, 0x10, 0, 0, 0, 0, 0x01,
                    347:         0x03, 0x07, 0x11, 0x12, 0x13
                    348:     };
                    349: 
                    350:     int i;
                    351:     for (i=0; i<ARRAY_SIZE(parammodes); i++) {
                    352:         int mode = GET_GLOBAL(parammodes[i]);
                    353:         if (! mode)
                    354:             continue;
                    355:         struct VideoParam_s *vparam_g = &video_param_table[i];
                    356:         struct vgamode_s *vmode_g = stdvga_find_mode(mode);
                    357:         if (!vmode_g)
                    358:             continue;
                    359:         int width = GET_GLOBAL(vmode_g->width);
                    360:         int height = GET_GLOBAL(vmode_g->height);
                    361:         u8 memmodel = GET_GLOBAL(vmode_g->memmodel);
                    362:         int cheight = GET_GLOBAL(vmode_g->cheight);
                    363:         if (memmodel == MM_TEXT) {
                    364:             SET_VGA(vparam_g->twidth, width);
                    365:             SET_VGA(vparam_g->theightm1, height-1);
                    366:         } else {
                    367:             int cwidth = GET_GLOBAL(vmode_g->cwidth);
                    368:             SET_VGA(vparam_g->twidth, width / cwidth);
                    369:             SET_VGA(vparam_g->theightm1, (height / cheight) - 1);
                    370:         }
                    371:         SET_VGA(vparam_g->cheight, cheight);
                    372:         SET_VGA(vparam_g->slength, calc_page_size(memmodel, width, height));
                    373:         struct stdvga_mode_s *stdmode_g = container_of(
                    374:             vmode_g, struct stdvga_mode_s, info);
                    375:         memcpy_far(get_global_seg(), vparam_g->sequ_regs
                    376:                    , get_global_seg(), GET_GLOBAL(stdmode_g->sequ_regs)
                    377:                    , ARRAY_SIZE(vparam_g->sequ_regs));
                    378:         SET_VGA(vparam_g->miscreg, GET_GLOBAL(stdmode_g->miscreg));
                    379:         memcpy_far(get_global_seg(), vparam_g->crtc_regs
                    380:                    , get_global_seg(), GET_GLOBAL(stdmode_g->crtc_regs)
                    381:                    , ARRAY_SIZE(vparam_g->crtc_regs));
                    382:         memcpy_far(get_global_seg(), vparam_g->actl_regs
                    383:                    , get_global_seg(), GET_GLOBAL(stdmode_g->actl_regs)
                    384:                    , ARRAY_SIZE(vparam_g->actl_regs));
                    385:         memcpy_far(get_global_seg(), vparam_g->grdc_regs
                    386:                    , get_global_seg(), GET_GLOBAL(stdmode_g->grdc_regs)
                    387:                    , ARRAY_SIZE(vparam_g->grdc_regs));
                    388:     }
                    389: }
                    390: 
                    391: void
                    392: stdvga_override_crtc(int mode, u8 *crtc)
                    393: {
                    394:     struct vgamode_s *vmode_g = stdvga_find_mode(mode);
                    395:     if (!vmode_g)
                    396:         return;
                    397:     struct stdvga_mode_s *stdmode_g = container_of(
                    398:         vmode_g, struct stdvga_mode_s, info);
                    399:     SET_VGA(stdmode_g->crtc_regs, crtc);
                    400: }
                    401: 
                    402: static void
                    403: clear_screen(struct vgamode_s *vmode_g)
                    404: {
                    405:     switch (GET_GLOBAL(vmode_g->memmodel)) {
                    406:     case MM_TEXT:
                    407:         memset16_far(GET_GLOBAL(vmode_g->sstart), 0, 0x0720, 32*1024);
                    408:         break;
                    409:     case MM_CGA:
                    410:         memset16_far(GET_GLOBAL(vmode_g->sstart), 0, 0x0000, 32*1024);
                    411:         break;
                    412:     default:
                    413:         // XXX - old code gets/sets/restores sequ register 2 to 0xf -
                    414:         // but it should always be 0xf anyway.
                    415:         memset16_far(GET_GLOBAL(vmode_g->sstart), 0, 0x0000, 64*1024);
                    416:     }
                    417: }
                    418: 
                    419: int
                    420: stdvga_set_mode(struct vgamode_s *vmode_g, int flags)
                    421: {
                    422:     if (! is_stdvga_mode(vmode_g)) {
                    423:         warn_internalerror();
                    424:         return -1;
                    425:     }
                    426:     struct stdvga_mode_s *stdmode_g = container_of(
                    427:         vmode_g, struct stdvga_mode_s, info);
                    428: 
                    429:     // if palette loading (bit 3 of modeset ctl = 0)
                    430:     if (!(flags & MF_NOPALETTE)) {    // Set the PEL mask
                    431:         stdvga_pelmask_write(GET_GLOBAL(stdmode_g->pelmask));
                    432: 
                    433:         // From which palette
                    434:         u8 *palette_g = GET_GLOBAL(stdmode_g->dac);
                    435:         u16 palsize = GET_GLOBAL(stdmode_g->dacsize) / 3;
                    436: 
                    437:         // Always 256*3 values
                    438:         stdvga_dac_write(get_global_seg(), palette_g, 0, palsize);
                    439:         int i;
                    440:         for (i = palsize; i < 0x0100; i++) {
                    441:             static u8 rgb[3] VAR16;
                    442:             stdvga_dac_write(get_global_seg(), rgb, i, 1);
                    443:         }
                    444: 
                    445:         if (flags & MF_GRAYSUM)
                    446:             stdvga_perform_gray_scale_summing(0x00, 0x100);
                    447:     }
                    448: 
                    449:     // Set Attribute Ctl
                    450:     u8 *regs = GET_GLOBAL(stdmode_g->actl_regs);
                    451:     int i;
                    452:     for (i = 0; i <= 0x13; i++)
                    453:         stdvga_attr_write(i, GET_GLOBAL(regs[i]));
                    454:     stdvga_attr_write(0x14, 0x00);
                    455: 
                    456:     // Set Sequencer Ctl
                    457:     stdvga_sequ_write(0x00, 0x03);
                    458:     regs = GET_GLOBAL(stdmode_g->sequ_regs);
                    459:     for (i = 1; i <= 4; i++)
                    460:         stdvga_sequ_write(i, GET_GLOBAL(regs[i - 1]));
                    461: 
                    462:     // Set Grafx Ctl
                    463:     regs = GET_GLOBAL(stdmode_g->grdc_regs);
                    464:     for (i = 0; i <= 8; i++)
                    465:         stdvga_grdc_write(i, GET_GLOBAL(regs[i]));
                    466: 
                    467:     // Set CRTC address VGA or MDA
                    468:     u8 miscreg = GET_GLOBAL(stdmode_g->miscreg);
                    469:     u16 crtc_addr = VGAREG_VGA_CRTC_ADDRESS;
                    470:     if (!(miscreg & 1))
                    471:         crtc_addr = VGAREG_MDA_CRTC_ADDRESS;
                    472: 
                    473:     // Disable CRTC write protection
                    474:     stdvga_crtc_write(crtc_addr, 0x11, 0x00);
                    475:     // Set CRTC regs
                    476:     regs = GET_GLOBAL(stdmode_g->crtc_regs);
                    477:     for (i = 0; i <= 0x18; i++)
                    478:         stdvga_crtc_write(crtc_addr, i, GET_GLOBAL(regs[i]));
                    479: 
                    480:     // Set the misc register
                    481:     stdvga_misc_write(miscreg);
                    482: 
                    483:     // Enable video
                    484:     stdvga_attrindex_write(0x20);
                    485: 
                    486:     // Clear screen
                    487:     if (!(flags & MF_NOCLEARMEM))
                    488:         clear_screen(vmode_g);
                    489: 
                    490:     // Write the fonts in memory
                    491:     u8 memmodel = GET_GLOBAL(vmode_g->memmodel);
                    492:     if (memmodel == MM_TEXT)
                    493:         stdvga_load_font(get_global_seg(), vgafont16, 0x100, 0, 0, 16);
                    494: 
                    495:     return 0;
                    496: }

unix.superglobalmegacorp.com

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