Implemented word & long read/write handlers for CL-GD5429.
This commit is contained in:
parent
1a430b574f
commit
c5d11b5d73
1 changed files with 55 additions and 6 deletions
|
|
@ -41,9 +41,6 @@ typedef struct gd5429_t
|
||||||
int dac_3c6_count;
|
int dac_3c6_count;
|
||||||
} gd5429_t;
|
} gd5429_t;
|
||||||
|
|
||||||
void gd5429_write(uint32_t addr, uint8_t val, void *p);
|
|
||||||
uint8_t gd5429_read(uint32_t addr, void *p);
|
|
||||||
|
|
||||||
void gd5429_mmio_write(uint32_t addr, uint8_t val, void *p);
|
void gd5429_mmio_write(uint32_t addr, uint8_t val, void *p);
|
||||||
uint8_t gd5429_mmio_read(uint32_t addr, void *p);
|
uint8_t gd5429_mmio_read(uint32_t addr, void *p);
|
||||||
|
|
||||||
|
|
@ -459,7 +456,7 @@ void gd5429_hwcursor_draw(svga_t *svga, int displine)
|
||||||
|
|
||||||
void gd5429_write_linear(uint32_t addr, uint8_t val, void *p);
|
void gd5429_write_linear(uint32_t addr, uint8_t val, void *p);
|
||||||
|
|
||||||
void gd5429_write(uint32_t addr, uint8_t val, void *p)
|
static void gd5429_write(uint32_t addr, uint8_t val, void *p)
|
||||||
{
|
{
|
||||||
gd5429_t *gd5429 = (gd5429_t *)p;
|
gd5429_t *gd5429 = (gd5429_t *)p;
|
||||||
svga_t *svga = &gd5429->svga;
|
svga_t *svga = &gd5429->svga;
|
||||||
|
|
@ -469,8 +466,42 @@ void gd5429_write(uint32_t addr, uint8_t val, void *p)
|
||||||
// pclog("%08X\n", addr);
|
// pclog("%08X\n", addr);
|
||||||
gd5429_write_linear(addr, val, p);
|
gd5429_write_linear(addr, val, p);
|
||||||
}
|
}
|
||||||
|
static void gd5429_writew(uint32_t addr, uint16_t val, void *p)
|
||||||
|
{
|
||||||
|
gd5429_t *gd5429 = (gd5429_t *)p;
|
||||||
|
svga_t *svga = &gd5429->svga;
|
||||||
|
|
||||||
uint8_t gd5429_read(uint32_t addr, void *p)
|
addr &= svga->banked_mask;
|
||||||
|
addr = (addr & 0x7fff) + gd5429->bank[(addr >> 15) & 1];
|
||||||
|
|
||||||
|
if (svga->writemode < 4)
|
||||||
|
svga_writew_linear(addr, val, svga);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gd5429_write_linear(addr, val, p);
|
||||||
|
gd5429_write_linear(addr+1, val >> 8, p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static void gd5429_writel(uint32_t addr, uint32_t val, void *p)
|
||||||
|
{
|
||||||
|
gd5429_t *gd5429 = (gd5429_t *)p;
|
||||||
|
svga_t *svga = &gd5429->svga;
|
||||||
|
|
||||||
|
addr &= svga->banked_mask;
|
||||||
|
addr = (addr & 0x7fff) + gd5429->bank[(addr >> 15) & 1];
|
||||||
|
|
||||||
|
if (svga->writemode < 4)
|
||||||
|
svga_writel_linear(addr, val, svga);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gd5429_write_linear(addr, val, p);
|
||||||
|
gd5429_write_linear(addr+1, val >> 8, p);
|
||||||
|
gd5429_write_linear(addr+2, val >> 16, p);
|
||||||
|
gd5429_write_linear(addr+3, val >> 24, p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint8_t gd5429_read(uint32_t addr, void *p)
|
||||||
{
|
{
|
||||||
gd5429_t *gd5429 = (gd5429_t *)p;
|
gd5429_t *gd5429 = (gd5429_t *)p;
|
||||||
svga_t *svga = &gd5429->svga;
|
svga_t *svga = &gd5429->svga;
|
||||||
|
|
@ -482,6 +513,24 @@ uint8_t gd5429_read(uint32_t addr, void *p)
|
||||||
// pclog("%08X %02X\n", addr, ret);
|
// pclog("%08X %02X\n", addr, ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
static uint16_t gd5429_readw(uint32_t addr, void *p)
|
||||||
|
{
|
||||||
|
gd5429_t *gd5429 = (gd5429_t *)p;
|
||||||
|
svga_t *svga = &gd5429->svga;
|
||||||
|
|
||||||
|
addr &= svga->banked_mask;
|
||||||
|
addr = (addr & 0x7fff) + gd5429->bank[(addr >> 15) & 1];
|
||||||
|
return svga_readw_linear(addr, &gd5429->svga);
|
||||||
|
}
|
||||||
|
static uint32_t gd5429_readl(uint32_t addr, void *p)
|
||||||
|
{
|
||||||
|
gd5429_t *gd5429 = (gd5429_t *)p;
|
||||||
|
svga_t *svga = &gd5429->svga;
|
||||||
|
|
||||||
|
addr &= svga->banked_mask;
|
||||||
|
addr = (addr & 0x7fff) + gd5429->bank[(addr >> 15) & 1];
|
||||||
|
return svga_readw_linear(addr, &gd5429->svga);
|
||||||
|
}
|
||||||
|
|
||||||
void gd5429_write_linear(uint32_t addr, uint8_t val, void *p)
|
void gd5429_write_linear(uint32_t addr, uint8_t val, void *p)
|
||||||
{
|
{
|
||||||
|
|
@ -1145,7 +1194,7 @@ void *gd5429_init()
|
||||||
gd5429_hwcursor_draw,
|
gd5429_hwcursor_draw,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
mem_mapping_set_handler(&gd5429->svga.mapping, gd5429_read, NULL, NULL, gd5429_write, NULL, NULL);
|
mem_mapping_set_handler(&gd5429->svga.mapping, gd5429_read, gd5429_readw, gd5429_readl, gd5429_write, gd5429_writew, gd5429_writel);
|
||||||
mem_mapping_set_p(&gd5429->svga.mapping, gd5429);
|
mem_mapping_set_p(&gd5429->svga.mapping, gd5429);
|
||||||
|
|
||||||
mem_mapping_add(&gd5429->mmio_mapping, 0, 0, gd5429_mmio_read, NULL, NULL, gd5429_mmio_write, NULL, NULL, NULL, 0, gd5429);
|
mem_mapping_add(&gd5429->mmio_mapping, 0, 0, gd5429_mmio_read, NULL, NULL, gd5429_mmio_write, NULL, NULL, NULL, 0, gd5429);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue