Changed registers used for EGA/VGA odd/even mode.
This commit is contained in:
parent
b108ffe89a
commit
3789398ca6
4 changed files with 16 additions and 9 deletions
|
|
@ -77,6 +77,9 @@ void ega_out(uint16_t addr, uint8_t val, void *p)
|
||||||
ega->charsetb = (((val >> 2) & 3) * 0x10000) + 2;
|
ega->charsetb = (((val >> 2) & 3) * 0x10000) + 2;
|
||||||
ega->charseta = ((val & 3) * 0x10000) + 2;
|
ega->charseta = ((val & 3) * 0x10000) + 2;
|
||||||
break;
|
break;
|
||||||
|
case 4:
|
||||||
|
ega->chain2_write = !(val & 4);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x3ce:
|
case 0x3ce:
|
||||||
|
|
@ -95,10 +98,10 @@ void ega_out(uint16_t addr, uint8_t val, void *p)
|
||||||
case 5:
|
case 5:
|
||||||
ega->writemode = val & 3;
|
ega->writemode = val & 3;
|
||||||
ega->readmode = val & 8;
|
ega->readmode = val & 8;
|
||||||
|
ega->chain2_read = val & 0x10;
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
// pclog("Write mapping %02X\n", val);
|
// pclog("Write mapping %02X\n", val);
|
||||||
ega->chain2 = val & 2;
|
|
||||||
switch (val & 0xc)
|
switch (val & 0xc)
|
||||||
{
|
{
|
||||||
case 0x0: /*128k at A0000*/
|
case 0x0: /*128k at A0000*/
|
||||||
|
|
@ -622,7 +625,7 @@ void ega_write(uint32_t addr, uint8_t val, void *p)
|
||||||
if (addr >= 0xB0000) addr &= 0x7fff;
|
if (addr >= 0xB0000) addr &= 0x7fff;
|
||||||
else addr &= 0xffff;
|
else addr &= 0xffff;
|
||||||
|
|
||||||
if (ega->chain2)
|
if (ega->chain2_write)
|
||||||
{
|
{
|
||||||
writemask2 &= ~0xa;
|
writemask2 &= ~0xa;
|
||||||
if (addr & 1)
|
if (addr & 1)
|
||||||
|
|
@ -755,7 +758,7 @@ uint8_t ega_read(uint32_t addr, void *p)
|
||||||
if (addr >= 0xb0000) addr &= 0x7fff;
|
if (addr >= 0xb0000) addr &= 0x7fff;
|
||||||
else addr &= 0xffff;
|
else addr &= 0xffff;
|
||||||
|
|
||||||
if (ega->chain2)
|
if (ega->chain2_read)
|
||||||
{
|
{
|
||||||
readplane = (readplane & 2) | (addr & 1);
|
readplane = (readplane & 2) | (addr & 1);
|
||||||
addr &= ~1;
|
addr &= ~1;
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ typedef struct ega_t
|
||||||
int fast;
|
int fast;
|
||||||
uint8_t colourcompare, colournocare;
|
uint8_t colourcompare, colournocare;
|
||||||
int readmode, writemode, readplane;
|
int readmode, writemode, readplane;
|
||||||
int chain4, chain2;
|
int chain4, chain2_read, chain2_write;
|
||||||
uint8_t writemask;
|
uint8_t writemask;
|
||||||
uint32_t charseta, charsetb;
|
uint32_t charseta, charsetb;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -111,6 +111,7 @@ void svga_out(uint16_t addr, uint8_t val, void *p)
|
||||||
svga->charsetb += 0x8000;
|
svga->charsetb += 0x8000;
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
|
svga->chain2_write = !(val & 4);
|
||||||
svga->chain4 = val & 8;
|
svga->chain4 = val & 8;
|
||||||
svga->fast = (svga->gdcreg[8] == 0xff && !(svga->gdcreg[3] & 0x18) && !svga->gdcreg[1]) && svga->chain4;
|
svga->fast = (svga->gdcreg[8] == 0xff && !(svga->gdcreg[3] & 0x18) && !svga->gdcreg[1]) && svga->chain4;
|
||||||
break;
|
break;
|
||||||
|
|
@ -159,10 +160,13 @@ void svga_out(uint16_t addr, uint8_t val, void *p)
|
||||||
{
|
{
|
||||||
case 2: svga->colourcompare=val; break;
|
case 2: svga->colourcompare=val; break;
|
||||||
case 4: svga->readplane=val&3; break;
|
case 4: svga->readplane=val&3; break;
|
||||||
case 5: svga->writemode=val&3; svga->readmode=val&8; break;
|
case 5:
|
||||||
|
svga->writemode = val & 3;
|
||||||
|
svga->readmode = val & 8;
|
||||||
|
svga->chain2_read = val & 0x10;
|
||||||
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
// pclog("svga_out recalcmapping %p\n", svga);
|
// pclog("svga_out recalcmapping %p\n", svga);
|
||||||
svga->chain2 = val & 2;
|
|
||||||
if ((svga->gdcreg[6] & 0xc) != (val & 0xc))
|
if ((svga->gdcreg[6] & 0xc) != (val & 0xc))
|
||||||
{
|
{
|
||||||
// pclog("Write mapping %02X\n", val);
|
// pclog("Write mapping %02X\n", val);
|
||||||
|
|
@ -741,7 +745,7 @@ void svga_write(uint32_t addr, uint8_t val, void *p)
|
||||||
writemask2=1<<(addr&3);
|
writemask2=1<<(addr&3);
|
||||||
addr&=~3;
|
addr&=~3;
|
||||||
}
|
}
|
||||||
else if (svga->chain2)
|
else if (svga->chain2_write)
|
||||||
{
|
{
|
||||||
writemask2 &= ~0xa;
|
writemask2 &= ~0xa;
|
||||||
if (addr & 1)
|
if (addr & 1)
|
||||||
|
|
@ -928,7 +932,7 @@ uint8_t svga_read(uint32_t addr, void *p)
|
||||||
return 0xff;
|
return 0xff;
|
||||||
return svga->vram[addr];
|
return svga->vram[addr];
|
||||||
}
|
}
|
||||||
else if (svga->chain2)
|
else if (svga->chain2_read)
|
||||||
{
|
{
|
||||||
readplane = (readplane & 2) | (addr & 1);
|
readplane = (readplane & 2) | (addr & 1);
|
||||||
addr &= ~1;
|
addr &= ~1;
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ typedef struct svga_t
|
||||||
int fast;
|
int fast;
|
||||||
uint8_t colourcompare, colournocare;
|
uint8_t colourcompare, colournocare;
|
||||||
int readmode, writemode, readplane;
|
int readmode, writemode, readplane;
|
||||||
int chain4, chain2;
|
int chain4, chain2_write, chain2_read;
|
||||||
uint8_t writemask;
|
uint8_t writemask;
|
||||||
uint32_t charseta, charsetb;
|
uint32_t charseta, charsetb;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue