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;
|
||||
} 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);
|
||||
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(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;
|
||||
svga_t *svga = &gd5429->svga;
|
||||
|
|
@ -469,8 +466,42 @@ void gd5429_write(uint32_t addr, uint8_t val, void *p)
|
|||
// pclog("%08X\n", addr);
|
||||
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;
|
||||
svga_t *svga = &gd5429->svga;
|
||||
|
|
@ -482,6 +513,24 @@ uint8_t gd5429_read(uint32_t addr, void *p)
|
|||
// pclog("%08X %02X\n", addr, 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)
|
||||
{
|
||||
|
|
@ -1145,7 +1194,7 @@ void *gd5429_init()
|
|||
gd5429_hwcursor_draw,
|
||||
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_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