RTL8029AS now works properly (patch from TheCollector1995 with some modifications by me);
SVGA emulation now has partial support for 12x24 text mode used by 48k HECON.SYS; LEA AX,DX now once again issues #UD on 286+ like it should; FF /7 is now correctly an alias of FF /6 on 8080x; Hard disk configuration dialog now uses Segoe UI 9pt font instead of MS Sans Serif 8pt; Removed excess logging from serial mouse and x86seg.c; Applied mainline PCem PIT MSW1 fix commit; IMG-based floppy emulation now takes GAP4 and post-sector delays into account; Comemnted out emulation of non-Overdrive Pentium II's.
This commit is contained in:
120
src/vid_svga.c
120
src/vid_svga.c
@@ -43,6 +43,19 @@ void svga_set_override(svga_t *svga, int val)
|
||||
svga->override = val;
|
||||
}
|
||||
|
||||
typedef union pci_bar
|
||||
{
|
||||
uint16_t word;
|
||||
uint8_t bytes[2];
|
||||
} ichar;
|
||||
|
||||
ichar char12x24[65536][48];
|
||||
uint8_t charedit_on = 0;
|
||||
ichar charcode;
|
||||
uint8_t charmode = 0;
|
||||
uint8_t charptr = 0;
|
||||
uint8_t charsettings = 0xEE;
|
||||
|
||||
void svga_out(uint16_t addr, uint8_t val, void *p)
|
||||
{
|
||||
svga_t *svga = (svga_t *)p;
|
||||
@@ -51,6 +64,40 @@ void svga_out(uint16_t addr, uint8_t val, void *p)
|
||||
// printf("OUT SVGA %03X %02X %04X:%04X\n",addr,val,CS,pc);
|
||||
switch (addr)
|
||||
{
|
||||
case 0x32CB:
|
||||
printf("Write 32CB: %04X\n", val);
|
||||
charedit_on = (val & 0x10) ? 1 : 0;
|
||||
charsettings = val;
|
||||
return;
|
||||
|
||||
case 0x22CB:
|
||||
printf("Write 22CB: %04X\n", val);
|
||||
charmode = val;
|
||||
charptr = 0;
|
||||
return;
|
||||
|
||||
case 0x22CF:
|
||||
printf("Write 22CF: %04X\n", val);
|
||||
// if (!charedit_on) return;
|
||||
switch(charmode)
|
||||
{
|
||||
case 1: case 2:
|
||||
charcode.bytes[charmode - 1] = val;
|
||||
return;
|
||||
case 3: case 4: /* Character bitmaps */
|
||||
char12x24[charcode.word][charptr].bytes[(charmode & 1) ^ 1] = val;
|
||||
charptr++;
|
||||
charptr %= 48;
|
||||
return;
|
||||
case 0xAA: default:
|
||||
return;
|
||||
}
|
||||
return;
|
||||
|
||||
case 0x22CA: case 0x22CE: case 0x32CA:
|
||||
printf("OUT SVGA %03X %02X %04X:%04X\n",addr,val,CS,cpu_state.pc);
|
||||
return;
|
||||
|
||||
case 0x3C0:
|
||||
if (!svga->attrff)
|
||||
{
|
||||
@@ -251,6 +298,41 @@ uint8_t svga_in(uint16_t addr, void *p)
|
||||
// if (addr!=0x3da) pclog("Read port %04X\n",addr);
|
||||
switch (addr)
|
||||
{
|
||||
case 0x22CA:
|
||||
pclog("Read port %04X\n", addr);
|
||||
return 0xAA;
|
||||
case 0x22CB:
|
||||
pclog("Read port %04X\n", addr);
|
||||
// return charmode;
|
||||
return 0xF0 | (charmode & 0x1F);
|
||||
case 0x22CE:
|
||||
pclog("Read port %04X\n", addr);
|
||||
return 0xCC;
|
||||
case 0x22CF: /* Read character bitmap */
|
||||
pclog("Read port %04X\n", addr);
|
||||
// if (!charedit_on) return 0xFF;
|
||||
switch(charmode)
|
||||
{
|
||||
case 1: case 2:
|
||||
return charcode.bytes[charmode - 1];
|
||||
case 3: case 4: /* Character bitmaps */
|
||||
/* Mode 3 is low bytes, mode 4 is high bytes */
|
||||
temp = char12x24[charcode.word][charptr].bytes[(charmode & 1) ^ 1];
|
||||
charptr++;
|
||||
charptr %= 48;
|
||||
return temp;
|
||||
case 0xAA: default:
|
||||
return 0xFF;
|
||||
}
|
||||
case 0x32CA:
|
||||
pclog("Read port %04X\n", addr);
|
||||
return 0xEE;
|
||||
case 0x32CB:
|
||||
pclog("Read port %04X\n", addr);
|
||||
return 0xEE;
|
||||
return charsettings;
|
||||
// return 0xEE | (charedit_on ? 0x10 : 0);
|
||||
|
||||
case 0x3C0:
|
||||
return svga->attraddr | svga->attr_palette_enable;
|
||||
case 0x3C1:
|
||||
@@ -384,13 +466,29 @@ void svga_recalctimings(svga_t *svga)
|
||||
{
|
||||
if (svga->seqregs[1] & 8) /*40 column*/
|
||||
{
|
||||
svga->render = svga_render_text_40;
|
||||
svga->hdisp *= (svga->seqregs[1] & 1) ? 16 : 18;
|
||||
if (svga->hdisp == 120)
|
||||
{
|
||||
svga->render = svga_render_text_40_12;
|
||||
svga->hdisp *= 16;
|
||||
}
|
||||
else
|
||||
{
|
||||
svga->render = svga_render_text_40;
|
||||
svga->hdisp *= (svga->seqregs[1] & 1) ? 16 : 18;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
svga->render = svga_render_text_80;
|
||||
svga->hdisp *= (svga->seqregs[1] & 1) ? 8 : 9;
|
||||
if (svga->hdisp == 120)
|
||||
{
|
||||
svga->render = svga_render_text_80_12;
|
||||
svga->hdisp *= 8;
|
||||
}
|
||||
else
|
||||
{
|
||||
svga->render = svga_render_text_80;
|
||||
svga->hdisp *= (svga->seqregs[1] & 1) ? 8 : 9;
|
||||
}
|
||||
}
|
||||
svga->hdisp_old = svga->hdisp;
|
||||
}
|
||||
@@ -804,6 +902,10 @@ int svga_init(svga_t *svga, void *p, int memsize,
|
||||
svga->ramdac_type = RAMDAC_6BIT;
|
||||
|
||||
svga_pointer = svga;
|
||||
|
||||
io_sethandler(0x22ca, 0x0002, svga_in, NULL, NULL, svga_out, NULL, NULL, svga);
|
||||
io_sethandler(0x22ce, 0x0002, svga_in, NULL, NULL, svga_out, NULL, NULL, svga);
|
||||
io_sethandler(0x32ca, 0x0002, svga_in, NULL, NULL, svga_out, NULL, NULL, svga);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1012,6 +1114,13 @@ void svga_write(uint32_t addr, uint8_t val, void *p)
|
||||
svga->gdcreg[8] = wm;
|
||||
break;
|
||||
}
|
||||
|
||||
if (svga->render == svga_render_text_80_12)
|
||||
{
|
||||
FILE *f = fopen("hecon.dmp", "wb");
|
||||
fwrite(svga->vram, 1, svga->vram_limit, f);
|
||||
fclose(f);
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t svga_read(uint32_t addr, void *p)
|
||||
@@ -1627,6 +1736,9 @@ void svga_add_status_info(char *s, int max_len, void *p)
|
||||
sprintf(temps, "SVGA resolution : %i x %i\n", svga->video_res_x, svga->video_res_y);
|
||||
strncat(s, temps, max_len);
|
||||
|
||||
sprintf(temps, "SVGA horizontal display : %i\n", svga->hdisp);
|
||||
strncat(s, temps, max_len);
|
||||
|
||||
sprintf(temps, "SVGA refresh rate : %i Hz (%s)\n\n", svga->frames, svga->interlace ? "i" : "p");
|
||||
svga->frames = 0;
|
||||
strncat(s, temps, max_len);
|
||||
|
||||
Reference in New Issue
Block a user