Added latest patches from Greatpsycho and correct memory detection based on ATI register B0.
This commit is contained in:
@@ -6,9 +6,9 @@
|
||||
*
|
||||
* This file is part of the 86Box distribution.
|
||||
*
|
||||
* ATI 28800 emulation (VGA Charger)
|
||||
* ATI 28800 emulation (VGA Charger and Korean VGA)
|
||||
*
|
||||
* Version: @(#)vid_ati28800.c 1.0.8 2018/03/02
|
||||
* Version: @(#)vid_ati28800.c 1.0.9 2018/03/05
|
||||
*
|
||||
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
|
||||
* Miran Grca, <mgrca8@gmail.com>
|
||||
@@ -58,6 +58,8 @@ typedef struct ati28800_t
|
||||
|
||||
uint8_t regs[256];
|
||||
int index;
|
||||
|
||||
uint32_t memory;
|
||||
} ati28800_t;
|
||||
|
||||
|
||||
@@ -68,7 +70,6 @@ int get_korean_font_enabled;
|
||||
int get_korean_font_index;
|
||||
uint16_t get_korean_font_base;
|
||||
extern int dbcs_mode_enabled;
|
||||
|
||||
|
||||
|
||||
static void ati28800_out(uint16_t addr, uint8_t val, void *p)
|
||||
@@ -88,6 +89,7 @@ static void ati28800_out(uint16_t addr, uint8_t val, void *p)
|
||||
ati28800->index = val;
|
||||
break;
|
||||
case 0x1cf:
|
||||
old=ati28800->regs[ati28800->index];
|
||||
ati28800->regs[ati28800->index] = val;
|
||||
switch (ati28800->index)
|
||||
{
|
||||
@@ -104,6 +106,9 @@ static void ati28800_out(uint16_t addr, uint8_t val, void *p)
|
||||
case 0xb3:
|
||||
ati_eeprom_write(&ati28800->eeprom, val & 8, val & 2, val & 1);
|
||||
break;
|
||||
case 0xb6:
|
||||
if((old ^ val) & 0x10) svga_recalctimings(svga);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -158,6 +163,7 @@ void ati28800k_out(uint16_t addr, uint8_t val, void *p)
|
||||
get_korean_font_kind = (val << 8) | (get_korean_font_kind & 0xFF);
|
||||
get_korean_font_enabled = 1;
|
||||
get_korean_font_index = 0;
|
||||
in_get_korean_font_kind_set = 0;
|
||||
}
|
||||
break;
|
||||
case 0x3DE:
|
||||
@@ -202,6 +208,15 @@ static uint8_t ati28800_in(uint16_t addr, void *p)
|
||||
case 0x1cf:
|
||||
switch (ati28800->index)
|
||||
{
|
||||
case 0xb0:
|
||||
if (ati28800->memory == 256)
|
||||
return 0x08;
|
||||
else if (ati28800->memory == 512)
|
||||
return 0x10;
|
||||
else
|
||||
return 0x18;
|
||||
break;
|
||||
|
||||
case 0xb7:
|
||||
temp = ati28800->regs[ati28800->index] & ~8;
|
||||
if (ati_eeprom_read(&ati28800->eeprom))
|
||||
@@ -275,11 +290,18 @@ uint8_t ati28800k_in(uint16_t addr, void *p)
|
||||
static void ati28800_recalctimings(svga_t *svga)
|
||||
{
|
||||
ati28800_t *ati28800 = (ati28800_t *)svga->p;
|
||||
pclog("ati28800_recalctimings\n");
|
||||
|
||||
if (ati28800->regs[0xb6] & 0x10)
|
||||
{
|
||||
svga->hdisp <<= 1;
|
||||
svga->htotal <<= 1;
|
||||
svga->rowoffset <<= 1;
|
||||
}
|
||||
|
||||
if (!svga->scrblank && (ati28800->regs[0xb0] & 0x20)) /*Extended 256 colour modes*/
|
||||
{
|
||||
pclog("8bpp_highres\n");
|
||||
svga->render = svga_render_8bpp_highres;
|
||||
svga->bpp = 8;
|
||||
svga->rowoffset <<= 1;
|
||||
svga->ma <<= 1;
|
||||
}
|
||||
@@ -291,7 +313,8 @@ ati28800k_init(device_t *info)
|
||||
ati28800_t *ati28800 = malloc(sizeof(ati28800_t));
|
||||
memset(ati28800, 0, sizeof(ati28800_t));
|
||||
|
||||
|
||||
ati28800->memory = device_get_config_int("memory");
|
||||
|
||||
port_03dd_val = 0;
|
||||
get_korean_font_base = 0;
|
||||
get_korean_font_index = 0;
|
||||
@@ -301,8 +324,9 @@ ati28800k_init(device_t *info)
|
||||
dbcs_mode_enabled = 0;
|
||||
|
||||
rom_init(&ati28800->bios_rom, BIOS_ATIKOR_PATH, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL);
|
||||
loadfont(FONT_ATIKOR_PATH, 6);
|
||||
|
||||
svga_init(&ati28800->svga, ati28800, 1 << 19, /*512kb*/
|
||||
svga_init(&ati28800->svga, ati28800, ati28800->memory << 10, /*Memory size, default 512KB*/
|
||||
ati28800_recalctimings,
|
||||
ati28800k_in, ati28800k_out,
|
||||
NULL,
|
||||
@@ -321,17 +345,12 @@ ati28800k_init(device_t *info)
|
||||
static void *
|
||||
ati28800_init(device_t *info)
|
||||
{
|
||||
uint32_t memory = 512;
|
||||
ati28800_t *ati;
|
||||
|
||||
#if 0
|
||||
if (info->type == GFX_VGAWONDERXL)
|
||||
#endif
|
||||
memory = device_get_config_int("memory");
|
||||
memory <<= 10;
|
||||
ati = malloc(sizeof(ati28800_t));
|
||||
memset(ati, 0x00, sizeof(ati28800_t));
|
||||
|
||||
ati->memory = device_get_config_int("memory");
|
||||
|
||||
switch(info->local) {
|
||||
case GFX_VGAWONDERXL:
|
||||
rom_init_interleaved(&ati->bios_rom,
|
||||
@@ -359,7 +378,7 @@ memory <<= 10;
|
||||
break;
|
||||
}
|
||||
|
||||
svga_init(&ati->svga, ati, memory, /*512kb*/
|
||||
svga_init(&ati->svga, ati, ati->memory << 10, /*default: 512kb*/
|
||||
ati28800_recalctimings,
|
||||
ati28800_in, ati28800_out,
|
||||
NULL,
|
||||
@@ -457,6 +476,9 @@ static device_config_t ati28800_config[] =
|
||||
{
|
||||
"512 kB", 512
|
||||
},
|
||||
{
|
||||
"1024 kB", 1024
|
||||
},
|
||||
{
|
||||
""
|
||||
}
|
||||
|
@@ -390,6 +390,15 @@ void svga_recalctimings(svga_t *svga)
|
||||
if (svga->crtc[9] & 0x20) svga->vblankstart |= 0x200;
|
||||
svga->vblankstart++;
|
||||
|
||||
if(svga->crtc[0x17] & 4)
|
||||
{
|
||||
svga->vtotal <<= 1;
|
||||
svga->dispend <<= 1;
|
||||
svga->vsyncstart <<= 1;
|
||||
svga->split <<= 1;
|
||||
svga->vblankstart <<= 1;
|
||||
}
|
||||
|
||||
svga->hdisp = svga->crtc[1];
|
||||
svga->hdisp++;
|
||||
|
||||
@@ -515,7 +524,7 @@ void svga_poll(void *p)
|
||||
}
|
||||
|
||||
if (svga->displine == svga->hwcursor_latch.y+1 && svga->hwcursor_latch.ena && svga->interlace) {
|
||||
svga->hwcursor_on = 64 - svga->hwcursor_latch.yoff;
|
||||
svga->hwcursor_on = 64 - (svga->hwcursor_latch.yoff + 1);
|
||||
svga->hwcursor_oddeven = 1;
|
||||
}
|
||||
|
||||
@@ -673,7 +682,9 @@ void svga_poll(void *p)
|
||||
} else {
|
||||
if (svga->crtc[9] & 0x80)
|
||||
svga->video_res_y /= 2;
|
||||
if (!(svga->crtc[0x17] & 1))
|
||||
if (!(svga->crtc[0x17] & 2))
|
||||
svga->video_res_y *= 4;
|
||||
else if (!(svga->crtc[0x17] & 1))
|
||||
svga->video_res_y *= 2;
|
||||
svga->video_res_y /= (svga->crtc[9] & 31) + 1;
|
||||
if (svga->lowres)
|
||||
@@ -1440,9 +1451,9 @@ void svga_writeb_linear(uint32_t addr, uint8_t val, void *p)
|
||||
return;
|
||||
}
|
||||
|
||||
egawrites += 2;
|
||||
egawrites++;
|
||||
|
||||
if (svga_output) pclog("Write LFBw %08X %04X\n", addr, val);
|
||||
if (svga_output) pclog("Write LFBb %08X %04X\n", addr, val);
|
||||
addr &= svga->decode_mask;
|
||||
if (addr >= svga->vram_max)
|
||||
return;
|
||||
|
Reference in New Issue
Block a user