1
0
Fork 0

Added MC6845 display controller support for hercules,cga,tandy machine modes.

Added cga,tandy,text modes.
Added some new tandy modes.
Added better tandy register support.


Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@1691
This commit is contained in:
Sjoerd van der Berg 2004-02-29 22:18:24 +00:00
parent 5ec076438e
commit f7c4b46991
19 changed files with 953 additions and 667 deletions

View file

@ -48,6 +48,20 @@ void VGA_SetMode(VGAModes mode) {
VGA_StartResize();
}
void VGA_DetermineMode(void) {
/* Test for graphics or alphanumeric mode */
if (vga.attr.mode_control & 1) {
if (!(vga.crtc.mode_control & 0x1)) {
if (vga.gfx.mode & 0x20) VGA_SetMode(M_CGA4);
else VGA_SetMode(M_CGA2);
} else if (vga.attr.mode_control & 0x40) {
VGA_SetMode(M_VGA);
} else VGA_SetMode(M_EGA16);
} else {
VGA_SetMode(M_TEXT);
}
}
void VGA_StartResize(void) {
if (!vga.draw.resizing) {
vga.draw.resizing=true;
@ -88,34 +102,56 @@ void VGA_SetClock(Bitu which,Bitu target) {
VGA_StartResize();
}
void VGA_SetCGA2Table(Bit8u val0,Bit8u val1) {
Bit8u total[2]={ val0,val1};
for (Bitu i=0;i<16;i++) {
CGA_2_Table[i]=
#ifdef WORDS_BIGENDIAN
(total[(i >> 0) & 1] << 0 ) | (total[(i >> 1) & 1] << 8 ) |
(total[(i >> 2) & 1] << 16 ) | (total[(i >> 3) & 1] << 24 );
#else
(total[(i >> 3) & 1] << 0 ) | (total[(i >> 2) & 1] << 8 ) |
(total[(i >> 1) & 1] << 16 ) | (total[(i >> 0) & 1] << 24 );
#endif
}
}
void VGA_SetCGA4Table(Bit8u val0,Bit8u val1,Bit8u val2,Bit8u val3) {
Bit8u total[4]={ val0,val1,val2,val3};
for (Bitu i=0;i<256;i++) {
CGA_4_Table[i]=
#ifdef WORDS_BIGENDIAN
(total[(i >> 0) & 3] << 0 ) | (total[(i >> 2) & 3] << 8 ) |
(total[(i >> 4) & 3] << 16 ) | (total[(i >> 6) & 3] << 24 );
#else
(total[(i >> 6) & 3] << 0 ) | (total[(i >> 4) & 3] << 8 ) |
(total[(i >> 2) & 3] << 16 ) | (total[(i >> 0) & 3] << 24 );
#endif
}
}
void VGA_Init(Section* sec) {
vga.draw.resizing=false;
vga.mode=M_ERROR; //For first init
VGA_SetupMemory();
VGA_SetupMisc();
VGA_SetupDAC();
VGA_SetupGFX();
VGA_SetupSEQ();
VGA_SetupAttr();
VGA_SetupOther();
VGA_SetClock(0,CLK_25);
VGA_SetClock(1,CLK_28);
/* Generate tables */
VGA_SetCGA2Table(0,1);
VGA_SetCGA4Table(0,1,2,3);
Bitu i,j;
for (i=0;i<256;i++) {
ExpandTable[i]=i | (i << 8)| (i <<16) | (i << 24);
#ifdef WORDS_BIGENDIAN
CGA_4_Table[i]=((i>>0)&3) | (((i>>2)&3) << 8)| (((i>>4)&3) <<16) | (((i>>6)&3) << 24);
#else
CGA_4_Table[i]=((i>>6)&3) | (((i>>4)&3) << 8)| (((i>>2)&3) <<16) | (((i>>0)&3) << 24);
#endif
}
for (i=0;i<16;i++) {
TXT_FG_Table[i]=i | (i << 8)| (i <<16) | (i << 24);
TXT_BG_Table[i]=i | (i << 8)| (i <<16) | (i << 24);
#ifdef WORDS_BIGENDIAN
CGA_2_Table[i]=((i>>0)&1) | (((i>>1)&1) << 8)| (((i>>1)&1) <<16) | (((i>>3)&1) << 24);
FillTable[i]=
((i & 1) ? 0xff000000 : 0) |
((i & 2) ? 0x00ff0000 : 0) |
@ -127,7 +163,6 @@ void VGA_Init(Section* sec) {
((i & 4) ? 0x00ff0000 : 0) |
((i & 8) ? 0xff000000 : 0) ;
#else
CGA_2_Table[i]=((i>>3)&1) | (((i>>2)&1) << 8)| (((i>>1)&1) <<16) | (((i>>0)&1) << 24);
FillTable[i]=
((i & 1) ? 0x000000ff : 0) |
((i & 2) ? 0x0000ff00 : 0) |
@ -138,7 +173,6 @@ void VGA_Init(Section* sec) {
((i & 2) ? 0x00ff0000 : 0) |
((i & 4) ? 0x0000ff00 : 0) |
((i & 8) ? 0x000000ff : 0) ;
#endif
}
for (j=0;j<4;j++) {