This commit is contained in:
OBattler
2020-05-12 13:37:06 +02:00
22 changed files with 1711 additions and 1341 deletions

View File

@@ -495,6 +495,10 @@ ati28800k_init(const device_t *info)
ati28800->svga.miscout = 1;
ati28800->svga.ksc5601_sbyte_mask = 0;
ati28800->svga.ksc5601_udc_area_msb[0] = 0xC9;
ati28800->svga.ksc5601_udc_area_msb[1] = 0xFE;
ati28800->svga.ksc5601_swap_mode = 0;
ati28800->svga.ksc5601_english_font_type = 0;
ati_eeprom_load(&ati28800->eeprom, L"atikorvga.nvr", 0);

View File

@@ -36,6 +36,7 @@
#include <86box/vid_svga.h>
#include <86box/vid_svga_render.h>
#define BIOS_GD5401_PATH L"roms/video/cirruslogic/avga1.rom"
#define BIOS_GD5402_PATH L"roms/video/cirruslogic/avga2.rom"
#define BIOS_GD5402_ONBOARD_PATH L"roms/video/machines/cbm_sl386sx25/Commodore386SX-25_AVGA2.bin"
#define BIOS_GD5420_PATH L"roms/video/cirruslogic/5420.vbi"
@@ -57,6 +58,7 @@
#define BIOS_GD5446_STB_PATH L"roms/video/cirruslogic/stb nitro64v.BIN"
#define BIOS_GD5480_PATH L"roms/video/cirruslogic/clgd5480.rom"
#define CIRRUS_ID_CLGD5401 0x88
#define CIRRUS_ID_CLGD5402 0x89
#define CIRRUS_ID_CLGD5420 0x8a
#define CIRRUS_ID_CLGD5422 0x8c
@@ -2963,6 +2965,11 @@ static void
gd54xx->has_bios = 1;
switch (id) {
case CIRRUS_ID_CLGD5401:
romfn = BIOS_GD5401_PATH;
break;
case CIRRUS_ID_CLGD5402:
if (info->local & 0x200)
romfn = BIOS_GD5402_ONBOARD_PATH;
@@ -3154,6 +3161,12 @@ static void
return gd54xx;
}
static int
gd5401_available(void)
{
return rom_present(BIOS_GD5401_PATH);
}
static int
gd5402_available(void)
{
@@ -3376,6 +3389,19 @@ static const device_config_t gd5434_config[] =
}
};
const device_t gd5401_isa_device =
{
"Cirrus Logic GD-5401 (ACUMOS AVGA1)",
DEVICE_AT | DEVICE_ISA,
CIRRUS_ID_CLGD5401,
gd54xx_init, gd54xx_close,
NULL,
gd5401_available,
gd54xx_speed_changed,
gd54xx_force_redraw,
NULL,
};
const device_t gd5402_isa_device =
{
"Cirrus Logic GD-5402 (ACUMOS AVGA2)",

View File

@@ -57,7 +57,8 @@
#define BIOS_ROM_PATH L"roms/video/et4000/et4000.bin"
#define KOREAN_BIOS_ROM_PATH L"roms/video/et4000/tgkorvga.bin"
#define KOREAN_FONT_ROM_PATH L"roms/video/et4000/tg_ksc5601.rom"
#define KASAN_BIOS_ROM_PATH L"roms/video/et4000/et4000_kasan16.bin"
#define KASAN_FONT_ROM_PATH L"roms/video/et4000/kasan_ksc5601.rom"
typedef struct {
const char *name;
@@ -78,6 +79,11 @@ typedef struct {
int get_korean_font_enabled;
int get_korean_font_index;
uint16_t get_korean_font_base;
uint8_t kasan_cfg_index;
uint8_t kasan_cfg_regs[16];
uint16_t kasan_access_addr;
uint8_t kasan_font_data[4];
} et4000_t;
@@ -95,6 +101,8 @@ static const uint8_t crtc_mask[0x40] = {
static video_timings_t timing_et4000_isa = {VIDEO_ISA, 3, 3, 6, 5, 5, 10};
static video_timings_t timing_et4000_mca = {VIDEO_MCA, 4, 5, 10, 5, 5, 10};
static void et4000_kasan_out(uint16_t addr, uint8_t val, void *p);
static uint8_t et4000_kasan_in(uint16_t addr, void *p);
static uint8_t
et4000_in(uint16_t addr, void *priv)
@@ -393,62 +401,248 @@ et4000k_out(uint16_t addr, uint8_t val, void *priv)
}
}
static uint8_t
et4000_kasan_in(uint16_t addr, void *priv)
{
et4000_t *et4000 = (et4000_t *)priv;
uint8_t val = 0xFF;
if (addr == 0x258) {
val = et4000->kasan_cfg_index;
} else if (addr == 0x259) {
if (et4000->kasan_cfg_index >= 0xF0) {
val = et4000->kasan_cfg_regs[et4000->kasan_cfg_index - 0xF0];
if (et4000->kasan_cfg_index == 0xF4 && et4000->kasan_cfg_regs[0] & 0x20)
val |= 0x80;
}
} else if (addr >= et4000->kasan_access_addr && addr < et4000->kasan_access_addr + 8) {
switch (addr - ((et4000->kasan_cfg_regs[2] << 8) | (et4000->kasan_cfg_regs[1]))) {
case 5:
if (((et4000->get_korean_font_base >> 7) & 0x7F) == (et4000->svga.ksc5601_udc_area_msb[0] & 0x7F) && (et4000->svga.ksc5601_udc_area_msb[0] & 0x80))
val = fontdatksc5601_user[(et4000->get_korean_font_base & 0x7F) - 0x20].chr[et4000->get_korean_font_index];
else if (((et4000->get_korean_font_base >> 7) & 0x7F) == (et4000->svga.ksc5601_udc_area_msb[1] & 0x7F) && (et4000->svga.ksc5601_udc_area_msb[1] & 0x80))
val = fontdatksc5601_user[96 + (et4000->get_korean_font_base & 0x7F) - 0x20].chr[et4000->get_korean_font_index];
else
val = fontdatksc5601[et4000->get_korean_font_base].chr[et4000->get_korean_font_index];
default:
break;
}
} else
val = et4000_in(addr, priv);
return val;
}
static void
et4000_kasan_out(uint16_t addr, uint8_t val, void *priv)
{
et4000_t *et4000 = (et4000_t *)priv;
if (addr == 0x258) {
et4000->kasan_cfg_index = val;
} else if (addr == 0x259) {
if (et4000->kasan_cfg_index >= 0xF0) {
switch (et4000->kasan_cfg_index - 0xF0) {
case 0:
if (et4000->kasan_cfg_regs[4] & 8)
val = (val & 0xFC) | (et4000->kasan_cfg_regs[0] & 3);
et4000->kasan_cfg_regs[0] = val;
et4000->svga.ksc5601_sbyte_mask = (val & 4) << 5;
svga_recalctimings(&et4000->svga);
break;
case 1:
case 2:
et4000->kasan_cfg_regs[et4000->kasan_cfg_index - 0xF0] = val;
io_removehandler(et4000->kasan_access_addr, 0x0008, et4000_kasan_in, NULL, NULL, et4000_kasan_out, NULL, NULL, et4000);
et4000->kasan_access_addr = (et4000->kasan_cfg_regs[2] << 8) | et4000->kasan_cfg_regs[1];
io_sethandler(et4000->kasan_access_addr, 0x0008, et4000_kasan_in, NULL, NULL, et4000_kasan_out, NULL, NULL, et4000);
break;
case 4:
if (et4000->kasan_cfg_regs[0] & 0x20)
val |= 0x80;
et4000->svga.ksc5601_swap_mode = (val & 4) >> 2;
et4000->kasan_cfg_regs[4] = val;
svga_recalctimings(&et4000->svga);
break;
case 5:
et4000->kasan_cfg_regs[5] = val;
et4000->svga.ksc5601_english_font_type = 0x100 | val;
case 6:
case 7:
et4000->svga.ksc5601_udc_area_msb[et4000->kasan_cfg_index - 0xF6] = val;
default:
et4000->kasan_cfg_regs[et4000->kasan_cfg_index - 0xF0] = val;
svga_recalctimings(&et4000->svga);
break;
}
}
} else if (addr >= et4000->kasan_access_addr && addr < et4000->kasan_access_addr + 8) {
switch (addr - ((et4000->kasan_cfg_regs[2] << 8) | (et4000->kasan_cfg_regs[1]))) {
case 0:
if (et4000->kasan_cfg_regs[0] & 2) {
et4000->get_korean_font_index = ((val & 1) << 4) | ((val & 0x1E) >> 1);
et4000->get_korean_font_base = (et4000->get_korean_font_base & ~7) | (val >> 5);
}
break;
case 1:
if (et4000->kasan_cfg_regs[0] & 2)
et4000->get_korean_font_base = (et4000->get_korean_font_base & ~0x7F8) | (val << 3);
break;
case 2:
if (et4000->kasan_cfg_regs[0] & 2)
et4000->get_korean_font_base = (et4000->get_korean_font_base & ~0x7F800) | ((val & 7) << 11);
break;
case 3:
case 4:
case 5:
if (et4000->kasan_cfg_regs[0] & 1)
et4000->kasan_font_data[addr - (((et4000->kasan_cfg_regs[2] << 8) | (et4000->kasan_cfg_regs[1])) + 3)] = val;
break;
case 6:
if ((et4000->kasan_cfg_regs[0] & 1) && (et4000->kasan_font_data[3] & !(val & 0x80)) && (et4000->get_korean_font_base & 0x7F) >= 0x20 && (et4000->get_korean_font_base & 0x7F) < 0x7F) {
if (((et4000->get_korean_font_base >> 7) & 0x7F) == (et4000->svga.ksc5601_udc_area_msb[0] & 0x7F) && (et4000->svga.ksc5601_udc_area_msb[0] & 0x80))
fontdatksc5601_user[(et4000->get_korean_font_base & 0x7F) - 0x20].chr[et4000->get_korean_font_index] = et4000->kasan_font_data[2];
else if (((et4000->get_korean_font_base >> 7) & 0x7F) == (et4000->svga.ksc5601_udc_area_msb[1] & 0x7F) && (et4000->svga.ksc5601_udc_area_msb[1] & 0x80))
fontdatksc5601_user[96 + (et4000->get_korean_font_base & 0x7F) - 0x20].chr[et4000->get_korean_font_index] = et4000->kasan_font_data[2];
}
et4000->kasan_font_data[3] = val;
break;
default:
break;
}
} else
et4000_out(addr, val, priv);
}
uint32_t
get_et4000_addr(uint32_t addr, void *p)
{
svga_t *svga = (svga_t *)p;
uint32_t nbank;
switch (svga->crtc[0x37] & 0x0B) {
case 0x00:
case 0x01:
nbank = 0;
addr &= 0xFFFF;
break;
case 0x02:
nbank = (addr & 1) << 1;
addr = (addr >> 1) & 0xFFFF;
break;
case 0x03:
nbank = addr & 3;
addr = (addr >> 2) & 0xFFFF;
break;
case 0x08:
case 0x09:
nbank = 0;
addr &= 0x3FFFF;
break;
case 0x0A:
nbank = (addr & 1) << 1;
addr = (addr >> 1) & 0x3FFFF;
break;
case 0x0B:
nbank = addr & 3;
addr = (addr >> 2) & 0x3FFFF;
break;
default:
nbank = 0;
break;
}
if (svga->vram_max >= 1024 * 1024) {
addr = (addr << 2) | (nbank & 3);
if ((svga->crtc[0x37] & 3) == 2)
addr >>= 1;
else if ((svga->crtc[0x37] & 3) < 2)
addr >>= 2;
} else if (svga->vram_max >= 512 * 1024) {
addr = (addr << 1) | ((nbank & 2) >> 1) | ((nbank & 1) << 19);
if ((svga->crtc[0x37] & 3) < 2)
addr >>= 1;
} else if(svga->vram_max >= 256 * 1024)
addr = addr | (nbank << 18);
else if (svga->vram_max > 128 * 1024) {
addr = (addr << 1) | ((nbank & 2) >> 1) | ((nbank & 1) << 17);
if ((svga->crtc[0x37] & 3) < 2)
addr >>= 1;
} else
addr = addr | (nbank << 16);
return addr;
}
static void
et4000_recalctimings(svga_t *svga)
{
et4000_t *dev = (et4000_t *)svga->p;
et4000_t *dev = (et4000_t *)svga->p;
svga->ma_latch |= (svga->crtc[0x33]&3)<<16;
if (svga->crtc[0x35] & 1) svga->vblankstart += 0x400;
if (svga->crtc[0x35] & 2) svga->vtotal += 0x400;
if (svga->crtc[0x35] & 4) svga->dispend += 0x400;
if (svga->crtc[0x35] & 8) svga->vsyncstart += 0x400;
if (svga->crtc[0x35] & 0x10) svga->split += 0x400;
if (!svga->rowoffset) svga->rowoffset = 0x100;
if (svga->crtc[0x3f] & 1) svga->htotal += 256;
if (svga->attrregs[0x16] & 0x20) svga->hdisp <<= 1;
svga->ma_latch |= (svga->crtc[0x33] & 3) << 16;
if (svga->crtc[0x35] & 1) svga->vblankstart += 0x400;
if (svga->crtc[0x35] & 2) svga->vtotal += 0x400;
if (svga->crtc[0x35] & 4) svga->dispend += 0x400;
if (svga->crtc[0x35] & 8) svga->vsyncstart += 0x400;
if (svga->crtc[0x35] & 0x10) svga->split += 0x400;
if (!svga->rowoffset) svga->rowoffset = 0x100;
if (svga->crtc[0x3f] & 1) svga->htotal += 256;
if (svga->attrregs[0x16] & 0x20) svga->hdisp <<= 1;
switch (((svga->miscout >> 2) & 3) | ((svga->crtc[0x34] << 1) & 4)) {
case 0:
case 1:
break;
switch (((svga->miscout >> 2) & 3) | ((svga->crtc[0x34] << 1) & 4)) {
case 0:
case 1:
break;
case 3:
svga->clock = (cpuclock * (double)(1ull << 32)) / 40000000.0;
break;
case 5:
svga->clock = (cpuclock * (double)(1ull << 32)) / 65000000.0;
break;
default:
svga->clock = (cpuclock * (double)(1ull << 32)) / 36000000.0;
break;
}
switch (svga->bpp) {
case 15:
case 16:
svga->hdisp /= 2;
break;
case 3:
svga->clock = (cpuclock * (double)(1ull << 32)) / 40000000.0;
break;
case 24:
svga->hdisp /= 3;
break;
}
case 5:
svga->clock = (cpuclock * (double)(1ull << 32)) / 65000000.0;
break;
default:
svga->clock = (cpuclock * (double)(1ull << 32)) / 36000000.0;
break;
}
switch (svga->bpp) {
case 15:
case 16:
svga->hdisp /= 2;
break;
case 24:
svga->hdisp /= 3;
break;
}
if (dev->type == 2 || dev->type == 3) {
#if NOT_YET
if ((svga->render == svga_render_text_80) && ((svga->crtc[0x37] & 0x0A) == 0x0A)) {
if ((dev->port_32cb_val & 0xB4) == ((svga->crtc[0x37] & 3) == 2 ? 0xB4 : 0xB0)) {
svga->render = svga_render_text_80_ksc5601;
if (dev->type == 2 || dev->type == 3 || dev->type == 4) {
if ((svga->render == svga_render_text_80) && ((svga->crtc[0x37] & 0x0A) == 0x0A)) {
if (dev->port_32cb_val & 0x80) {
svga->ma_latch -= 2;
svga->ca_adj = -2;
}
if ((dev->port_32cb_val & 0xB4) == ((svga->crtc[0x37] & 3) == 2 ? 0xB4 : 0xB0)) {
svga->render = svga_render_text_80_ksc5601;
}
}
}
#endif
}
}
static void
et4000_kasan_recalctimings(svga_t *svga)
{
et4000_t *et4000 = (et4000_t *)svga->p;
et4000_recalctimings(svga);
if (svga->render == svga_render_text_80 && (et4000->kasan_cfg_regs[0] & 8)) {
svga->ma_latch -= 3 - (et4000->kasan_cfg_regs[3] >> 1);
svga->ca_adj = -(3 - (et4000->kasan_cfg_regs[0] >> 6));
svga->hdisp -= (et4000->kasan_cfg_regs[3] >> 1) * ((svga->seqregs[1] & 1) ? 8 : 9);
if ((et4000->kasan_cfg_regs[0] & 3) == 0 && (et4000->kasan_cfg_regs[4] & 0x80) && ((svga->crtc[0x37] & 0x0B) == 0x0A))
svga->render = svga_render_text_80_ksc5601;
}
}
static uint8_t
et4000_mca_read(int port, void *priv)
@@ -484,6 +678,7 @@ et4000_init(const device_t *info)
{
const wchar_t *fn;
et4000_t *dev;
int i;
dev = (et4000_t *)malloc(sizeof(et4000_t));
memset(dev, 0x00, sizeof(et4000_t));
@@ -521,6 +716,10 @@ et4000_init(const device_t *info)
dev->port_22cb_val = 0x60;
dev->port_32cb_val = 0;
dev->svga.ksc5601_sbyte_mask = 0x80;
dev->svga.ksc5601_udc_area_msb[0] = 0xC9;
dev->svga.ksc5601_udc_area_msb[1] = 0xFE;
dev->svga.ksc5601_swap_mode = 0;
dev->svga.ksc5601_english_font_type = 0;
video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_et4000_isa);
svga_init(info, &dev->svga, dev, dev->vram_size,
et4000_recalctimings, et4000k_in, et4000k_out,
@@ -536,6 +735,40 @@ et4000_init(const device_t *info)
loadfont(KOREAN_FONT_ROM_PATH, 6);
fn = KOREAN_BIOS_ROM_PATH;
break;
case 4: /* Kasan ET4000 */
dev->vram_size = device_get_config_int("memory") << 10;
dev->svga.ksc5601_sbyte_mask = 0;
dev->svga.ksc5601_udc_area_msb[0] = 0xC9;
dev->svga.ksc5601_udc_area_msb[1] = 0xFE;
dev->svga.ksc5601_swap_mode = 0;
dev->svga.ksc5601_english_font_type = 0x1FF;
dev->kasan_cfg_index = 0;
for (i=0; i<16; i++)
dev->kasan_cfg_regs[i] = 0;
for(i=0; i<4; i++)
dev->kasan_font_data[i] = 0;
dev->kasan_cfg_regs[1] = 0x50;
dev->kasan_cfg_regs[2] = 2;
dev->kasan_cfg_regs[3] = 6;
dev->kasan_cfg_regs[4] = 0x78;
dev->kasan_cfg_regs[5] = 0xFF;
dev->kasan_cfg_regs[6] = 0xC9;
dev->kasan_cfg_regs[7] = 0xFE;
dev->kasan_access_addr = 0x250;
video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_et4000_isa);
svga_init(info, &dev->svga, dev, dev->vram_size,
et4000_kasan_recalctimings, et4000_in, et4000_out,
NULL, NULL);
io_sethandler(0x03c0, 32,
et4000_in,NULL,NULL, et4000_out,NULL,NULL, dev);
io_sethandler(0x0250, 8,
et4000_kasan_in, NULL, NULL, et4000_kasan_out, NULL, NULL, dev);
io_sethandler(0x0258, 2,
et4000_kasan_in, NULL, NULL, et4000_kasan_out, NULL, NULL, dev);
loadfont(KASAN_FONT_ROM_PATH, 6);
fn = KASAN_BIOS_ROM_PATH;
break;
}
dev->svga.ramdac = device_add(&sc1502x_ramdac_device);
@@ -545,6 +778,8 @@ et4000_init(const device_t *info)
rom_init(&dev->bios_rom, (wchar_t *) fn,
0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL);
dev->svga.translate_address = get_et4000_addr;
return(dev);
}
@@ -592,6 +827,12 @@ et4000k_available(void)
rom_present(KOREAN_FONT_ROM_PATH);
}
static int
et4000_kasan_available(void)
{
return rom_present(KASAN_BIOS_ROM_PATH) &&
rom_present(KASAN_FONT_ROM_PATH);
}
static const device_config_t et4000_config[] =
{
@@ -660,3 +901,14 @@ const device_t et4000k_tg286_isa_device = {
et4000_force_redraw,
et4000_config
};
const device_t et4000_kasan_isa_device = {
"Kasan Hangulmadang-16 VGA (Tseng Labs ET4000AX Korean)",
DEVICE_ISA,
4,
et4000_init, et4000_close, NULL,
et4000_kasan_available,
et4000_speed_changed,
et4000_force_redraw,
et4000_config
};

View File

@@ -445,7 +445,8 @@ svga_recalctimings(svga_t *svga)
svga->interlace = 0;
svga->ma_latch = (svga->crtc[0xc] << 8) | svga->crtc[0xd];
svga->ma_latch = ((svga->crtc[0xc] << 8) | svga->crtc[0xd]) + ((svga->crtc[8] & 0x60) >> 5);
svga->ca_adj = 0;
svga->hdisp_time = svga->hdisp;
svga->render = svga_render_blank;
@@ -809,7 +810,7 @@ svga_poll(void *p)
svga->ma = svga->maback = svga->ma_latch + (svga->rowoffset << 1);
else
svga->ma = svga->maback = svga->ma_latch;
svga->ca = (svga->crtc[0xe] << 8) | svga->crtc[0xf];
svga->ca = ((svga->crtc[0xe] << 8) | svga->crtc[0xf]) + ((svga->crtc[0xb] & 0x60) >> 5) + svga->ca_adj;
svga->ma = (svga->ma << 2) + (skip << 2);
svga->maback = (svga->maback << 2) + (skip << 2);
@@ -911,6 +912,9 @@ svga_init(const device_t *info, svga_t *svga, void *p, int memsize,
svga->dac_hwcursor.xsize = svga->dac_hwcursor.ysize = 32;
svga->dac_hwcursor.yoff = 32;
svga->translate_address = NULL;
svga->ksc5601_english_font_type = 0;
if ((info->flags & DEVICE_PCI) || (info->flags & DEVICE_VLB)) {
mem_mapping_add(&svga->mapping, 0xa0000, 0x20000,
@@ -1036,6 +1040,9 @@ svga_write_common(uint32_t addr, uint8_t val, uint8_t linear, void *p)
addr &= svga->decode_mask;
if (svga->translate_address)
addr = svga->translate_address(addr, p);
if (addr >= svga->vram_max)
return;
@@ -1168,6 +1175,8 @@ svga_read_common(uint32_t addr, uint8_t linear, void *p)
addr <<= 3;
else if (svga->chain4 || svga->fb_only) {
addr &= svga->decode_mask;
if (svga->translate_address)
addr = svga->translate_address(addr, p);
if (addr >= svga->vram_max)
return 0xff;
return svga->vram[addr & svga->vram_mask];
@@ -1179,6 +1188,12 @@ svga_read_common(uint32_t addr, uint8_t linear, void *p)
addr <<= 2;
addr &= svga->decode_mask;
if (!linear) {
if (svga->translate_address) {
latch_addr = svga->translate_address(latch_addr, p);
addr = svga->translate_address(addr, p);
}
}
/* standard VGA latched access */
if (latch_addr >= svga->vram_max) {
@@ -1375,6 +1390,19 @@ svga_writew_common(uint32_t addr, uint16_t val, uint8_t linear, void *p)
}
addr &= svga->decode_mask;
if(svga->translate_address) {
uint32_t addr2 = svga->translate_address(addr, p);
if (addr2 < svga->vram_max) {
svga->vram[addr2 & svga->vram_mask] = val & 0xff;
svga->changedvram[addr2 >> 12] = changeframecount;
}
addr2 = svga->translate_address(addr+1, p);
if (addr2 < svga->vram_max) {
svga->vram[addr2 & svga->vram_mask] = (val >> 8) & 0xff;
svga->changedvram[addr2 >> 12] = changeframecount;
}
return;
}
if (addr >= svga->vram_max)
return;
addr &= svga->vram_mask;
@@ -1423,6 +1451,29 @@ svga_writel_common(uint32_t addr, uint32_t val, uint8_t linear, void *p)
}
addr &= svga->decode_mask;
if (svga->translate_address) {
uint32_t addr2 = svga->translate_address(addr, p);
if (addr2 < svga->vram_max) {
svga->vram[addr2 & svga->vram_mask] = val & 0xff;
svga->changedvram[addr2 >> 12] = changeframecount;
}
addr2 = svga->translate_address(addr+1, p);
if (addr2 < svga->vram_max) {
svga->vram[addr2 & svga->vram_mask] = (val >> 8) & 0xff;
svga->changedvram[addr2 >> 12] = changeframecount;
}
addr2 = svga->translate_address(addr+2, p);
if (addr2 < svga->vram_max) {
svga->vram[addr2 & svga->vram_mask] = (val >> 16) & 0xff;
svga->changedvram[addr2 >> 12] = changeframecount;
}
addr2 = svga->translate_address(addr+3, p);
if (addr2 < svga->vram_max) {
svga->vram[addr2 & svga->vram_mask] = (val >> 24) & 0xff;
svga->changedvram[addr2 >> 12] = changeframecount;
}
return;
}
if (addr >= svga->vram_max)
return;
addr &= svga->vram_mask;
@@ -1484,6 +1535,16 @@ svga_readw_common(uint32_t addr, uint8_t linear, void *p)
}
addr &= svga->decode_mask;
if (svga->translate_address) {
uint8_t val1 = 0xff, val2 = 0xff;
uint32_t addr2 = svga->translate_address(addr, p);
if (addr2 < svga->vram_max)
val1 = svga->vram[addr2 & svga->vram_mask];
addr2 = svga->translate_address(addr+1, p);
if (addr2 < svga->vram_max)
val2 = svga->vram[addr2 & svga->vram_mask];
return (val2 << 8) | val1;
}
if (addr >= svga->vram_max)
return 0xffff;
@@ -1527,6 +1588,22 @@ svga_readl_common(uint32_t addr, uint8_t linear, void *p)
}
addr &= svga->decode_mask;
if (svga->translate_address) {
uint8_t val1 = 0xff, val2 = 0xff, val3 = 0xff, val4 = 0xff;
uint32_t addr2 = svga->translate_address(addr, p);
if (addr2 < svga->vram_max)
val1 = svga->vram[addr2 & svga->vram_mask];
addr2 = svga->translate_address(addr+1, p);
if (addr2 < svga->vram_max)
val2 = svga->vram[addr2 & svga->vram_mask];
addr2 = svga->translate_address(addr+2, p);
if (addr2 < svga->vram_max)
val3 = svga->vram[addr2 & svga->vram_mask];
addr2 = svga->translate_address(addr+3, p);
if (addr2 < svga->vram_max)
val4 = svga->vram[addr2 & svga->vram_mask];
return (val4 << 24) | (val3 << 16) | (val2 << 8) | val1;
}
if (addr >= svga->vram_max)
return 0xffffffff;

View File

@@ -258,17 +258,24 @@ svga_render_text_80_ksc5601(svga_t *svga)
}
if ((x + xinc) < svga->hdisp && (chr & (nextchr | svga->ksc5601_sbyte_mask) & 0x80)) {
if (((chr == 0xc9) || (chr == 0xfe)) && ((nextchr > 0xa0) && (nextchr < 0xff)))
dat = fontdatksc5601_user[((chr == 0xfe) ? 96 : 0) + (nextchr & 0x7F) - 0x20].chr[svga->sc];
else if (nextchr & 0x80)
if ((chr == svga->ksc5601_udc_area_msb[0] || chr == svga->ksc5601_udc_area_msb[1]) && (nextchr > 0xa0 && nextchr < 0xff))
dat = fontdatksc5601_user[(chr == svga->ksc5601_udc_area_msb[1] ? 96 : 0) + (nextchr & 0x7F) - 0x20].chr[svga->sc];
else if (nextchr & 0x80) {
if (svga->ksc5601_swap_mode == 1 && (nextchr > 0xa0 && nextchr < 0xff)) {
if(chr >= 0x80 && chr < 0x99) chr += 0x30;
else if(chr >= 0xB0 && chr < 0xC9) chr -= 0x30;
}
dat = fontdatksc5601[((chr & 0x7F) << 7) | (nextchr & 0x7F)].chr[svga->sc];
else
} else
dat = 0xff;
} else {
if (attr & 8) charaddr = svga->charsetb + (chr * 128);
else charaddr = svga->charseta + (chr * 128);
dat = svga->vram[charaddr + (svga->sc << 2)];
if ((svga->ksc5601_english_font_type >> 8) == 1)
dat = fontdatksc5601[((svga->ksc5601_english_font_type & 0x7F) << 7) | (chr >> 1)].chr[((chr & 1) << 4) | svga->sc];
else
dat = svga->vram[charaddr + (svga->sc << 2)];
}
if (svga->seqregs[1] & 1) {
@@ -301,8 +308,8 @@ svga_render_text_80_ksc5601(svga_t *svga)
}
}
if (((chr == 0xc9) || (chr == 0xfe)) && ((nextchr > 0xa0) && (nextchr < 0xff)))
dat = fontdatksc5601_user[(chr == 0xfe ? 96 : 0) + (nextchr & 0x7F) - 0x20].chr[svga->sc + 16];
if ((chr == svga->ksc5601_udc_area_msb[0] || chr == svga->ksc5601_udc_area_msb[1]) && (nextchr > 0xa0 && nextchr < 0xff))
dat = fontdatksc5601_user[(chr == svga->ksc5601_udc_area_msb[1] ? 96 : 0) + (nextchr & 0x7F) - 0x20].chr[svga->sc + 16];
else if(nextchr & 0x80)
dat = fontdatksc5601[((chr & 0x7f) << 7) | (nextchr & 0x7F)].chr[svga->sc + 16];
else

View File

@@ -68,6 +68,7 @@ video_cards[] = {
#endif
{ "[ISA] CGA", "cga", &cga_device },
{ "[ISA] Chips & Technologies SuperEGA", "superega", &sega_device },
{ "[ISA] Cirrus Logic CL-GD 5401", "cl_gd5401_isa", &gd5401_isa_device },
{ "[ISA] Cirrus Logic CL-GD 5402", "cl_gd5402_isa", &gd5402_isa_device },
{ "[ISA] Cirrus Logic CL-GD 5420", "cl_gd5420_isa", &gd5420_isa_device },
#if defined(DEV_BRANCH) && defined(USE_CL5422)
@@ -86,6 +87,7 @@ video_cards[] = {
{ "[ISA] Hercules Plus", "hercules_plus", &herculesplus_device },
{ "[ISA] Hercules InColor", "incolor", &incolor_device },
{ "[ISA] Image Manager 1024", "im1024", &im1024_device },
{ "[ISA] Kasan Hangulmadang-16 VGA (ET4000AX)", "kasan16vga", &et4000_kasan_isa_device },
{ "[ISA] MDA", "mda", &mda_device },
{ "[ISA] MDSI Genius", "genius", &genius_device },
{ "[ISA] OAK OTI-037C", "oti037c", &oti037c_device },