diff --git a/src/video/vid_cl54xx.c b/src/video/vid_cl54xx.c
index d87594a15..294410aa7 100644
--- a/src/video/vid_cl54xx.c
+++ b/src/video/vid_cl54xx.c
@@ -6,10 +6,10 @@
*
* This file is part of the 86Box distribution.
*
- * Emulation of select Cirrus Logic cards (currently
- * CL-GD 5428, 5429, 5430 and 5434 are supported).
+ * Emulation of select Cirrus Logic cards (CL-GD 5428,
+ * CL-GD 5429, 5430, 5434 and 5436 are supported).
*
- * Version: @(#)vid_cl_54xx.c 1.0.3 2018/02/24
+ * Version: @(#)vid_cl_54xx.c 1.0.4 2018/02/25
*
* Authors: Sarah Walker,
* Barry Rodewald,
@@ -46,13 +46,14 @@
#define BIOS_GD5430_VLB_PATH L"roms/video/cirruslogic/diamondvlbus.bin"
#define BIOS_GD5430_PCI_PATH L"roms/video/cirruslogic/pci.bin"
#define BIOS_GD5434_PATH L"roms/video/cirruslogic/gd5434.bin"
+#define BIOS_GD5436_PATH L"roms/video/cirruslogic/5436.vbi"
#define CIRRUS_ID_CLGD5424 0x94
#define CIRRUS_ID_CLGD5428 0x98
#define CIRRUS_ID_CLGD5429 0x9c
#define CIRRUS_ID_CLGD5430 0xa0
#define CIRRUS_ID_CLGD5434 0xa8
-#define CIRRUS_ID_CLGD5446 0xb8
+#define CIRRUS_ID_CLGD5436 0xac
/* sequencer 0x07 */
#define CIRRUS_SR7_BPP_VGA 0x00
@@ -92,6 +93,11 @@
#define CIRRUS_BLTMODE_PIXELWIDTH24 0x20
#define CIRRUS_BLTMODE_PIXELWIDTH32 0x30
+// control 0x33
+#define CIRRUS_BLTMODEEXT_SOLIDFILL 0x04
+#define CIRRUS_BLTMODEEXT_COLOREXPINV 0x02
+#define CIRRUS_BLTMODEEXT_DWORDGRANULARITY 0x01
+
#define CL_GD5429_SYSTEM_BUS_VESA 5
#define CL_GD5429_SYSTEM_BUS_ISA 7
@@ -127,7 +133,8 @@ typedef struct gd54xx_t
uint16_t dst_pitch, src_pitch;
uint32_t dst_addr, src_addr;
uint8_t mask, mode, rop;
- uint8_t status;
+ uint8_t modeext;
+ uint8_t bltstart;
uint16_t trans_col, trans_mask;
uint32_t dst_addr_backup, src_addr_backup;
@@ -360,7 +367,11 @@ gd54xx_out(uint16_t addr, uint8_t val, void *p)
case 0x32:
gd543x_mmio_write(0xb801a, val, gd54xx);
break;
-
+
+ case 0x33:
+ gd543x_mmio_write(0xb801b, val, gd54xx);
+ break;
+
case 0x31:
gd543x_mmio_write(0xb8040, val, gd54xx);
break;
@@ -480,8 +491,6 @@ gd54xx_in(uint16_t addr, void *p)
if (svga->crtc[0x27] == CIRRUS_ID_CLGD5430)
return 0xff; /*Standard CL-GD5430*/
break;
-
-
}
return svga->crtc[svga->crtcreg];
}
@@ -546,7 +555,7 @@ gd543x_recalc_mapping(gd54xx_t *gd54xx)
gd54xx->mmio_vram_overlap = 1;
break;
}
- if (svga->seqregs[0x17] & 0x04)
+ if (svga->seqregs[0x17] & CIRRUS_MMIO_ENABLE)
mem_mapping_set_addr(&gd54xx->mmio_mapping, 0xb8000, 0x00100);
else
mem_mapping_disable(&gd54xx->mmio_mapping);
@@ -569,6 +578,7 @@ gd543x_recalc_mapping(gd54xx_t *gd54xx)
mem_mapping_disable(&svga->mapping);
mem_mapping_set_addr(&gd54xx->linear_mapping, base, size);
+ svga->linear_base = base;
if (svga->seqregs[0x17] & CIRRUS_MMIO_ENABLE)
mem_mapping_set_addr(&gd54xx->mmio_mapping, 0xb8000, 0x00100);
else
@@ -593,7 +603,7 @@ gd54xx_recalctimings(svga_t *svga)
{
if (!(svga->gdcreg[5] & 0x60)) /*This is needed for the shutdown screens on Win9x to render correctly*/
svga->gdcreg[5] = 0x60;
-
+
switch (svga->bpp)
{
case 8:
@@ -634,7 +644,8 @@ gd54xx_recalctimings(svga_t *svga)
freq /= 2.0;
break;
case 4:
- freq /= 3.0;
+ if (svga->crtc[0x27] < CIRRUS_ID_CLGD5436)
+ freq /= 3.0;
break;
}
svga->clock = cpuclock / freq;
@@ -707,12 +718,12 @@ gd5428_copy_pixel(gd54xx_t *gd54xx, svga_t *svga, uint8_t src, uint8_t dst)
case 0xda: res = ~(src & dst); break;
}
- /* handle transparency compare */
- if(gd54xx->blt.mode & CIRRUS_BLTMODE_TRANSPARENTCOMP) { /* TODO: 16-bit compare */
+ /* handle transparency compare */
+ if(gd54xx->blt.mode & CIRRUS_BLTMODE_TRANSPARENTCOMP) { /* TODO: 16-bit compare */
/* if ROP result matches the transparency colour, don't change the pixel */
if((res & (~gd54xx->blt.trans_mask & 0xff)) == ((gd54xx->blt.trans_col & 0xff) & (~gd54xx->blt.trans_mask & 0xff)))
return;
- }
+ }
svga->vram[gd54xx->blt.dst_addr_backup & svga->vram_mask] = res;
}
@@ -1265,6 +1276,18 @@ gd543x_mmio_write(uint32_t addr, uint8_t val, void *p)
gd54xx->blt.dst_addr &= 0x3fffff;
else
gd54xx->blt.dst_addr &= 0x1fffff;
+
+ if ((svga->crtc[0x27] >= CIRRUS_ID_CLGD5436) && (gd54xx->blt.bltstart & 0x80)) {
+ if (gd54xx->blt.mode == CIRRUS_BLTMODE_MEMSYSSRC) {
+ gd54xx->blt.sys_tx = 1;
+ gd54xx->blt.sys_cnt = 0;
+ gd54xx->blt.sys_buf = 0;
+ gd54xx->blt.pixel_cnt = gd54xx->blt.scan_cnt = 0;
+ gd54xx->blt.src_addr_backup = gd54xx->blt.src_addr;
+ gd54xx->blt.dst_addr_backup = gd54xx->blt.dst_addr;
+ } else
+ gd54xx_start_blit(0, -1, gd54xx, svga);
+ }
break;
case 0x14:
@@ -1292,6 +1315,11 @@ gd543x_mmio_write(uint32_t addr, uint8_t val, void *p)
gd54xx->blt.rop = val;
break;
+ case 0x1b:
+ if (svga->crtc[0x27] >= CIRRUS_ID_CLGD5436)
+ gd54xx->blt.modeext = val;
+ break;
+
case 0x1c:
if (svga->crtc[0x27] <= CIRRUS_ID_CLGD5434)
gd54xx->blt.trans_col = (gd54xx->blt.trans_col & 0xff00) | val;
@@ -1313,7 +1341,8 @@ gd543x_mmio_write(uint32_t addr, uint8_t val, void *p)
break;
case 0x40:
- if (val & 0x02) {
+ gd54xx->blt.bltstart = val;
+ if (gd54xx->blt.bltstart & 0x02) {
if (gd54xx->blt.mode == CIRRUS_BLTMODE_MEMSYSSRC) {
gd54xx->blt.sys_tx = 1;
gd54xx->blt.sys_cnt = 0;
@@ -1412,18 +1441,37 @@ gd543x_mmio_readl(uint32_t addr, void *p)
static void
gd54xx_start_blit(uint32_t cpu_dat, int count, gd54xx_t *gd54xx, svga_t *svga)
{
- int blt_mask = gd54xx->blt.mask & 7;
+ int blt_mask = 0;
int x_max = 0;
-
+
switch (gd54xx->blt.mode & CIRRUS_BLTMODE_PIXELWIDTHMASK) {
case CIRRUS_BLTMODE_PIXELWIDTH8:
+ blt_mask = gd54xx->blt.mask & 7;
x_max = 8;
break;
case CIRRUS_BLTMODE_PIXELWIDTH16:
+ blt_mask = gd54xx->blt.mask & 7;
x_max = 16;
blt_mask *= 2;
break;
+ case CIRRUS_BLTMODE_PIXELWIDTH24:
+ if (svga->crtc[0x27] >= CIRRUS_ID_CLGD5436)
+ {
+ x_max = 24;
+ if (gd54xx->blt.mode & CIRRUS_BLTMODE_PATTERNCOPY)
+ {
+ blt_mask = (gd54xx->blt.mask & 0x1f);
+ blt_mask /= 3;
+ }
+ else
+ {
+ blt_mask = gd54xx->blt.mask & 7;
+ blt_mask *= 3;
+ }
+ }
+ break;
case CIRRUS_BLTMODE_PIXELWIDTH32:
+ blt_mask = gd54xx->blt.mask & 7;
x_max = 32;
blt_mask *= 4;
break;
@@ -1475,7 +1523,11 @@ gd54xx_start_blit(uint32_t cpu_dat, int count, gd54xx_t *gd54xx, svga_t *svga)
if (gd54xx->blt.mode & CIRRUS_BLTMODE_MEMSYSSRC) {
if (gd54xx->blt.mode & CIRRUS_BLTMODE_COLOREXPAND) {
- mask = cpu_dat & 0x80;
+
+ if (gd54xx->blt.modeext & CIRRUS_BLTMODEEXT_DWORDGRANULARITY)
+ mask = (cpu_dat >> 31);
+ else
+ mask = cpu_dat & 0x80;
switch (gd54xx->blt.mode & CIRRUS_BLTMODE_PIXELWIDTHMASK)
{
@@ -1495,6 +1547,22 @@ gd54xx_start_blit(uint32_t cpu_dat, int count, gd54xx_t *gd54xx, svga_t *svga)
count--;
}
break;
+ case CIRRUS_BLTMODE_PIXELWIDTH24:
+ if (svga->crtc[0x27] >= CIRRUS_ID_CLGD5436)
+ {
+ if ((gd54xx->blt.x_count % 3) == 2)
+ src = mask ? (gd54xx->blt.fg_col >> 16) : (gd54xx->blt.bg_col >> 16);
+ else if ((gd54xx->blt.x_count % 3) == 1)
+ src = mask ? (gd54xx->blt.fg_col >> 8) : (gd54xx->blt.bg_col >> 8);
+ else
+ src = mask ? gd54xx->blt.fg_col : gd54xx->blt.bg_col;
+ if ((gd54xx->blt.x_count % 3) == 2)
+ {
+ cpu_dat <<= 1;
+ count--;
+ }
+ }
+ break;
case CIRRUS_BLTMODE_PIXELWIDTH32:
if ((gd54xx->blt.x_count & 3) == 3)
src = mask ? (gd54xx->blt.fg_col >> 24) : (gd54xx->blt.bg_col >> 24);
@@ -1528,6 +1596,11 @@ gd54xx_start_blit(uint32_t cpu_dat, int count, gd54xx_t *gd54xx, svga_t *svga)
case CIRRUS_BLTMODE_PIXELWIDTH16:
src = svga->vram[(gd54xx->blt.src_addr & (svga->vram_mask & ~3)) + (gd54xx->blt.y_count << 4) + (gd54xx->blt.x_count & 15)];
break;
+ case CIRRUS_BLTMODE_PIXELWIDTH24:
+ pclog("Pattern copy\n");
+ if (svga->crtc[0x27] >= CIRRUS_ID_CLGD5436)
+ src = svga->vram[(gd54xx->blt.src_addr & (svga->vram_mask & ~3)) + (gd54xx->blt.y_count << 5) + (gd54xx->blt.x_count % 24)];
+ break;
case CIRRUS_BLTMODE_PIXELWIDTH32:
src = svga->vram[(gd54xx->blt.src_addr & (svga->vram_mask & ~3)) + (gd54xx->blt.y_count << 5) + (gd54xx->blt.x_count & 31)];
break;
@@ -1548,11 +1621,21 @@ gd54xx_start_blit(uint32_t cpu_dat, int count, gd54xx_t *gd54xx, svga_t *svga)
else
src = mask ? gd54xx->blt.fg_col : gd54xx->blt.bg_col;
break;
+ case CIRRUS_BLTMODE_PIXELWIDTH24:
+ if (svga->crtc[0x27] >= CIRRUS_ID_CLGD5436)
+ {
+ mask = svga->vram[gd54xx->blt.src_addr & svga->vram_mask] & (0x80 >> (gd54xx->blt.x_count / 3));
+ if ((gd54xx->blt.dst_addr % 3) == 2)
+ src = mask ? (gd54xx->blt.fg_col >> 16) : (gd54xx->blt.bg_col >> 16);
+ else if ((gd54xx->blt.dst_addr % 3) == 1)
+ src = mask ? (gd54xx->blt.fg_col >> 8) : (gd54xx->blt.bg_col >> 8);
+ else
+ src = mask ? gd54xx->blt.fg_col : gd54xx->blt.bg_col;
+ }
+ break;
case CIRRUS_BLTMODE_PIXELWIDTH32:
mask = svga->vram[gd54xx->blt.src_addr & svga->vram_mask] & (0x80 >> (gd54xx->blt.x_count >> 2));
- if ((gd54xx->blt.dst_addr & 3) == 3)
- src = mask ? (gd54xx->blt.fg_col >> 24) : (gd54xx->blt.bg_col >> 24);
- else if ((gd54xx->blt.dst_addr & 3) == 2)
+ if ((gd54xx->blt.dst_addr & 3) == 2)
src = mask ? (gd54xx->blt.fg_col >> 16) : (gd54xx->blt.bg_col >> 16);
else if ((gd54xx->blt.dst_addr & 3) == 1)
src = mask ? (gd54xx->blt.fg_col >> 8) : (gd54xx->blt.bg_col >> 8);
@@ -1562,30 +1645,80 @@ gd54xx_start_blit(uint32_t cpu_dat, int count, gd54xx_t *gd54xx, svga_t *svga)
}
break;
case CIRRUS_BLTMODE_PATTERNCOPY|CIRRUS_BLTMODE_COLOREXPAND:
- switch (gd54xx->blt.mode & CIRRUS_BLTMODE_PIXELWIDTHMASK)
+ if (gd54xx->blt.modeext & CIRRUS_BLTMODEEXT_SOLIDFILL)
{
- case CIRRUS_BLTMODE_PIXELWIDTH8:
- mask = svga->vram[(gd54xx->blt.src_addr & svga->vram_mask & ~7) | gd54xx->blt.y_count] & (0x80 >> gd54xx->blt.x_count);
- src = mask ? gd54xx->blt.fg_col : gd54xx->blt.bg_col;
- break;
- case CIRRUS_BLTMODE_PIXELWIDTH16:
- mask = svga->vram[(gd54xx->blt.src_addr & svga->vram_mask & ~7) | gd54xx->blt.y_count] & (0x80 >> (gd54xx->blt.x_count >> 1));
- if (gd54xx->blt.dst_addr & 1)
- src = mask ? (gd54xx->blt.fg_col >> 8) : (gd54xx->blt.bg_col >> 8);
- else
- src = mask ? gd54xx->blt.fg_col : gd54xx->blt.bg_col;
- break;
- case CIRRUS_BLTMODE_PIXELWIDTH32:
- mask = svga->vram[(gd54xx->blt.src_addr & svga->vram_mask & ~7) | gd54xx->blt.y_count] & (0x80 >> (gd54xx->blt.x_count >> 2));
- if ((gd54xx->blt.dst_addr & 3) == 3)
- src = mask ? (gd54xx->blt.fg_col >> 24) : (gd54xx->blt.bg_col >> 24);
- else if ((gd54xx->blt.dst_addr & 3) == 2)
- src = mask ? (gd54xx->blt.fg_col >> 16) : (gd54xx->blt.bg_col >> 16);
- else if ((gd54xx->blt.dst_addr & 3) == 1)
- src = mask ? (gd54xx->blt.fg_col >> 8) : (gd54xx->blt.bg_col >> 8);
- else
+ switch (gd54xx->blt.mode & CIRRUS_BLTMODE_PIXELWIDTHMASK)
+ {
+ case CIRRUS_BLTMODE_PIXELWIDTH8:
+ src = gd54xx->blt.fg_col;
+ break;
+ case CIRRUS_BLTMODE_PIXELWIDTH16:
+ if (gd54xx->blt.dst_addr & 1)
+ src = (gd54xx->blt.fg_col >> 8);
+ else
+ src = gd54xx->blt.fg_col;
+ break;
+ case CIRRUS_BLTMODE_PIXELWIDTH24:
+ if ((gd54xx->blt.dst_addr % 3) == 2)
+ src = (gd54xx->blt.fg_col >> 16);
+ else if ((gd54xx->blt.dst_addr % 3) == 1)
+ src = (gd54xx->blt.fg_col >> 8);
+ else
+ src = gd54xx->blt.fg_col;
+ break;
+
+ case CIRRUS_BLTMODE_PIXELWIDTH32:
+ if ((gd54xx->blt.dst_addr & 3) == 3)
+ src = (gd54xx->blt.fg_col >> 24);
+ else if ((gd54xx->blt.dst_addr & 3) == 2)
+ src = (gd54xx->blt.fg_col >> 16);
+ else if ((gd54xx->blt.dst_addr & 3) == 1)
+ src = (gd54xx->blt.fg_col >> 8);
+ else
+ src = gd54xx->blt.fg_col;
+ break;
+ }
+ }
+ else
+ {
+ switch (gd54xx->blt.mode & CIRRUS_BLTMODE_PIXELWIDTHMASK)
+ {
+ case CIRRUS_BLTMODE_PIXELWIDTH8:
+ mask = svga->vram[(gd54xx->blt.src_addr & svga->vram_mask & ~7) | gd54xx->blt.y_count] & (0x80 >> gd54xx->blt.x_count);
src = mask ? gd54xx->blt.fg_col : gd54xx->blt.bg_col;
- break;
+ break;
+ case CIRRUS_BLTMODE_PIXELWIDTH16:
+ mask = svga->vram[(gd54xx->blt.src_addr & svga->vram_mask & ~7) | gd54xx->blt.y_count] & (0x80 >> (gd54xx->blt.x_count >> 1));
+ if (gd54xx->blt.dst_addr & 1)
+ src = mask ? (gd54xx->blt.fg_col >> 8) : (gd54xx->blt.bg_col >> 8);
+ else
+ src = mask ? gd54xx->blt.fg_col : gd54xx->blt.bg_col;
+ break;
+ case CIRRUS_BLTMODE_PIXELWIDTH24:
+ if (svga->crtc[0x27] >= CIRRUS_ID_CLGD5436)
+ {
+ mask = svga->vram[(gd54xx->blt.src_addr & svga->vram_mask & ~7) | gd54xx->blt.y_count] & (0x80 >> (gd54xx->blt.x_count / 3));
+ if ((gd54xx->blt.dst_addr % 3) == 2)
+ src = mask ? (gd54xx->blt.fg_col >> 16) : (gd54xx->blt.bg_col >> 16);
+ else if ((gd54xx->blt.dst_addr % 3) == 1)
+ src = mask ? (gd54xx->blt.fg_col >> 8) : (gd54xx->blt.bg_col >> 8);
+ else
+ src = mask ? gd54xx->blt.fg_col : gd54xx->blt.bg_col;
+ }
+ break;
+
+ case CIRRUS_BLTMODE_PIXELWIDTH32:
+ mask = svga->vram[(gd54xx->blt.src_addr & svga->vram_mask & ~7) | gd54xx->blt.y_count] & (0x80 >> (gd54xx->blt.x_count >> 2));
+ if ((gd54xx->blt.dst_addr & 3) == 3)
+ src = mask ? (gd54xx->blt.fg_col >> 24) : (gd54xx->blt.bg_col >> 24);
+ else if ((gd54xx->blt.dst_addr & 3) == 2)
+ src = mask ? (gd54xx->blt.fg_col >> 16) : (gd54xx->blt.bg_col >> 16);
+ else if ((gd54xx->blt.dst_addr & 3) == 1)
+ src = mask ? (gd54xx->blt.fg_col >> 8) : (gd54xx->blt.bg_col >> 8);
+ else
+ src = mask ? gd54xx->blt.fg_col : gd54xx->blt.bg_col;
+ break;
+ }
}
break;
}
@@ -1612,10 +1745,19 @@ gd54xx_start_blit(uint32_t cpu_dat, int count, gd54xx_t *gd54xx, svga_t *svga)
case 0xd6: dst = ~src | dst; break;
case 0xda: dst = ~(src & dst); break;
}
-
- if ((gd54xx->blt.width_backup - gd54xx->blt.width) >= blt_mask &&
- !((gd54xx->blt.mode & CIRRUS_BLTMODE_TRANSPARENTCOMP) && !mask))
- svga->vram[gd54xx->blt.dst_addr & svga->vram_mask] = dst;
+
+ if (gd54xx->blt.modeext & CIRRUS_BLTMODEEXT_COLOREXPINV)
+ {
+ if ((gd54xx->blt.width_backup - gd54xx->blt.width) >= blt_mask &&
+ !((gd54xx->blt.mode & CIRRUS_BLTMODE_TRANSPARENTCOMP) && mask))
+ svga->vram[gd54xx->blt.dst_addr & svga->vram_mask] = dst;
+ }
+ else
+ {
+ if ((gd54xx->blt.width_backup - gd54xx->blt.width) >= blt_mask &&
+ !((gd54xx->blt.mode & CIRRUS_BLTMODE_TRANSPARENTCOMP) && !mask))
+ svga->vram[gd54xx->blt.dst_addr & svga->vram_mask] = dst;
+ }
gd54xx->blt.dst_addr += ((gd54xx->blt.mode & CIRRUS_BLTMODE_BACKWARDS) ? -1 : 1);
@@ -1691,8 +1833,8 @@ cl_pci_read(int func, int addr, void *p)
return 0xa0;
case CIRRUS_ID_CLGD5434:
return 0xa8;
- case CIRRUS_ID_CLGD5446:
- return 0xb8;
+ case CIRRUS_ID_CLGD5436:
+ return 0xac;
}
return 0xff;
case 0x03: return 0x00;
@@ -1797,6 +1939,10 @@ static void
case CIRRUS_ID_CLGD5434:
romfn = BIOS_GD5434_PATH;
break;
+
+ case CIRRUS_ID_CLGD5436:
+ romfn = BIOS_GD5436_PATH;
+ break;
}
gd54xx->vram_size = device_get_config_int("memory");
@@ -1834,8 +1980,6 @@ static void
break;
}
- svga->seqregs[0x17] = CIRRUS_BUSTYPE_ISA; /*ISA, required by Win3.1 drivers for CL-GD5429 and up*/
-
svga->hwcursor.yoff = 32;
svga->hwcursor.xoff = 0;
@@ -1898,6 +2042,12 @@ gd5434_available(void)
return rom_present(BIOS_GD5434_PATH);
}
+static int
+gd5436_available(void)
+{
+ return rom_present(BIOS_GD5436_PATH);
+}
+
void
gd54xx_close(void *p)
{
@@ -2006,7 +2156,6 @@ device_t gd5428_isa_device =
gd5428_config
};
-
device_t gd5428_vlb_device =
{
"Cirrus Logic CL-GD 5428 (VLB)",
@@ -2022,7 +2171,6 @@ device_t gd5428_vlb_device =
gd5428_config
};
-
device_t gd5429_isa_device =
{
"Cirrus Logic CL-GD 5429 (ISA)",
@@ -2053,7 +2201,6 @@ device_t gd5429_vlb_device =
gd5428_config
};
-
device_t gd5430_vlb_device =
{
"Cirrus Logic CL-GD 5430 (VLB)",
@@ -2069,7 +2216,6 @@ device_t gd5430_vlb_device =
gd5428_config
};
-
device_t gd5430_pci_device =
{
"Cirrus Logic CL-GD 5430 (PCI)",
@@ -2085,23 +2231,6 @@ device_t gd5430_pci_device =
gd5428_config
};
-
-device_t gd5430_onboard_pci_device =
-{
- "Cirrus Logic CL-GD 5430 On-Board (PCI)",
- DEVICE_PCI,
- 0x8000 | CIRRUS_ID_CLGD5430,
- gd54xx_init,
- gd54xx_close,
- NULL,
- NULL,
- gd54xx_speed_changed,
- gd54xx_force_redraw,
- gd54xx_add_status_info,
- gd5428_config
-};
-
-
device_t gd5434_isa_device =
{
"Cirrus Logic CL-GD 5434 (ISA)",
@@ -2117,7 +2246,6 @@ device_t gd5434_isa_device =
gd5434_config
};
-
device_t gd5434_vlb_device =
{
"Cirrus Logic CL-GD 5434 (VLB)",
@@ -2133,7 +2261,6 @@ device_t gd5434_vlb_device =
gd5434_config
};
-
device_t gd5434_pci_device =
{
"Cirrus Logic CL-GD 5434 (PCI)",
@@ -2149,16 +2276,15 @@ device_t gd5434_pci_device =
gd5434_config
};
-
-device_t gd5434_onboard_pci_device =
+device_t gd5436_pci_device =
{
- "Cirrus Logic CL-GD 5434 On-Board (PCI)",
+ "Cirrus Logic CL-GD 5436 (PCI)",
DEVICE_PCI,
- 0x8000 | CIRRUS_ID_CLGD5434,
+ CIRRUS_ID_CLGD5436,
gd54xx_init,
gd54xx_close,
NULL,
- NULL,
+ gd5436_available,
gd54xx_speed_changed,
gd54xx_force_redraw,
gd54xx_add_status_info,
diff --git a/src/video/vid_cl54xx.h b/src/video/vid_cl54xx.h
index fab2a0b11..2bf9e6aaf 100644
--- a/src/video/vid_cl54xx.h
+++ b/src/video/vid_cl54xx.h
@@ -7,8 +7,7 @@ extern device_t gd5429_isa_device;
extern device_t gd5429_vlb_device;
extern device_t gd5430_vlb_device;
extern device_t gd5430_pci_device;
-extern device_t gd5430_onboard_pci_device;
extern device_t gd5434_isa_device;
extern device_t gd5434_vlb_device;
extern device_t gd5434_pci_device;
-extern device_t gd5434_onboard_pci_device;
+extern device_t gd5436_pci_device;
\ No newline at end of file
diff --git a/src/video/vid_table.c b/src/video/vid_table.c
index d1175226f..e18cd41c0 100644
--- a/src/video/vid_table.c
+++ b/src/video/vid_table.c
@@ -8,7 +8,7 @@
*
* Define all known video cards.
*
- * Version: @(#)vid_table.c 1.0.21 2018/02/18
+ * Version: @(#)vid_table.c 1.0.22 2018/02/25
*
* Authors: Miran Grca,
* Fred N. van Kempen,
@@ -129,6 +129,7 @@ video_cards[] = {
{"[PCI] Cardex Tseng ET4000/w32p", "et4000w32p_pci", &et4000w32p_cardex_pci_device,GFX_ET4000W32_CARDEX_PCI,VIDEO_FLAG_TYPE_SPECIAL,{VIDEO_BUS, 4, 4, 4, 10, 10, 10}},
{"[PCI] Cirrus Logic CL-GD 5430", "cl_gd5430_pci", &gd5430_pci_device, GFX_CL_GD5430_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 8, 10, 10, 20}},
{"[PCI] Cirrus Logic CL-GD 5434", "cl_gd5434_pci", &gd5434_pci_device, GFX_CL_GD5434_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 8, 10, 10, 20}},
+ {"[PCI] Cirrus Logic CL-GD 5436", "cl_gd5436_pci", &gd5436_pci_device, GFX_CL_GD5436_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 8, 10, 10, 20}},
#if defined(DEV_BRANCH) && defined(USE_STEALTH32)
{"[PCI] Diamond Stealth 32 (Tseng ET4000/w32p)","stealth32_pci", &et4000w32p_pci_device, GFX_ET4000W32_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 4, 10, 10, 10}},
#endif
diff --git a/src/video/video.h b/src/video/video.h
index 8780d3d69..1a03361d6 100644
--- a/src/video/video.h
+++ b/src/video/video.h
@@ -8,7 +8,7 @@
*
* Definitions for the video controller module.
*
- * Version: @(#)video.h 1.0.20 2018/02/24
+ * Version: @(#)video.h 1.0.21 2018/02/25
*
* Authors: Sarah Walker,
* Miran Grca,
@@ -81,7 +81,7 @@ enum {
GFX_CL_GD5434_ISA, /* Cirrus Logic CL-GD 5434 ISA */
GFX_CL_GD5434_VLB, /* Cirrus Logic CL-GD 5434 VLB */
GFX_CL_GD5434_PCI, /* Cirrus Logic CL-GD 5434 PCI */
- GFX_CL_GD5446, /* Cirrus Logic CL-GD 5446 PCI (coming) */
+ GFX_CL_GD5436_PCI, /* Cirrus Logic CL-GD 5436 PCI */
#if defined(DEV_BRANCH) && defined(USE_RIVA)
GFX_RIVATNT, /* nVidia Riva TNT */
GFX_RIVATNT2, /* nVidia Riva TNT2 */
diff --git a/src/win/win_cdrom_ioctl.c b/src/win/win_cdrom_ioctl.c
index 9b1e588bb..b07527f2b 100644
--- a/src/win/win_cdrom_ioctl.c
+++ b/src/win/win_cdrom_ioctl.c
@@ -9,7 +9,7 @@
* Implementation of the CD-ROM host drive IOCTL interface for
* Windows using SCSI Passthrough Direct.
*
- * Version: @(#)cdrom_ioctl.c 1.0.11 2018/02/15
+ * Version: @(#)cdrom_ioctl.c 1.0.12 2018/02/25
*
* Authors: Sarah Walker,
* Miran Grca,
@@ -464,7 +464,7 @@ static uint8_t ioctl_getcurrentsubchannel(uint8_t id, uint8_t *b, int msf)
b[pos + 1] = (uint8_t)dat;
b[pos] = 0;
pos += 4;
- dat = cdpos - track_address;
+ dat = cdpos - track_address - 150;
b[pos + 3] = (uint8_t)(dat % 75); dat /= 75;
b[pos + 2] = (uint8_t)(dat % 60); dat /= 60;
b[pos + 1] = (uint8_t)dat;
diff --git a/src/win/win_new_floppy.c b/src/win/win_new_floppy.c
index 8aa623f09..4384fcceb 100644
--- a/src/win/win_new_floppy.c
+++ b/src/win/win_new_floppy.c
@@ -8,7 +8,7 @@
*
* Handle the New Floppy Image dialog.
*
- * Version: @(#)win_new_floppy.c 1.0.1 2018/01/26
+ * Version: @(#)win_new_floppy.c 1.0.2 2018/02/25
*
* Authors: Miran Grca,
*
@@ -77,7 +77,7 @@ create_86f(WCHAR *file_name, disk_size_t disk_size, uint8_t rpm_mode)
uint16_t version = 0x020B;
uint16_t dflags = 0;
uint16_t tflags = 0;
- uint16_t index_hole_pos = 0;
+ uint32_t index_hole_pos = 0;
uint32_t tarray[512];
uint32_t array_size, array_size2;
uint32_t track_base, track_size;