From 26fb271fdc10a20760781216716cc27ba0e5d492 Mon Sep 17 00:00:00 2001 From: SarahW Date: Wed, 31 Jan 2018 20:03:14 +0000 Subject: [PATCH] Paradise now supports SVGA word accesses. --- src/vid_paradise.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/vid_paradise.c b/src/vid_paradise.c index 80347e6..e8ad9a2 100644 --- a/src/vid_paradise.c +++ b/src/vid_paradise.c @@ -30,11 +30,8 @@ typedef struct paradise_t uint32_t read_bank[4], write_bank[4]; } paradise_t; -void paradise_write(uint32_t addr, uint8_t val, void *p); -uint8_t paradise_read(uint32_t addr, void *p); void paradise_remap(paradise_t *paradise); - void paradise_out(uint16_t addr, uint8_t val, void *p) { paradise_t *paradise = (paradise_t *)p; @@ -236,7 +233,7 @@ void paradise_recalctimings(svga_t *svga) svga->render = svga_render_8bpp_highres; } -void paradise_write(uint32_t addr, uint8_t val, void *p) +static void paradise_write(uint32_t addr, uint8_t val, void *p) { paradise_t *paradise = (paradise_t *)p; // pclog("paradise_write : %05X %02X ", addr, val); @@ -244,8 +241,14 @@ void paradise_write(uint32_t addr, uint8_t val, void *p) // pclog("%08X\n", addr); svga_write_linear(addr, val, ¶dise->svga); } +static void paradise_writew(uint32_t addr, uint16_t val, void *p) +{ + paradise_t *paradise = (paradise_t *)p; + addr = (addr & 0x7fff) + paradise->write_bank[(addr >> 15) & 3]; + svga_writew_linear(addr, val, ¶dise->svga); +} -uint8_t paradise_read(uint32_t addr, void *p) +static uint8_t paradise_read(uint32_t addr, void *p) { paradise_t *paradise = (paradise_t *)p; // pclog("paradise_read : %05X ", addr); @@ -253,6 +256,12 @@ uint8_t paradise_read(uint32_t addr, void *p) // pclog("%08X\n", addr); return svga_read_linear(addr, ¶dise->svga); } +static uint16_t paradise_readw(uint32_t addr, void *p) +{ + paradise_t *paradise = (paradise_t *)p; + addr = (addr & 0x7fff) + paradise->read_bank[(addr >> 15) & 3]; + return svga_readw_linear(addr, ¶dise->svga); +} void *paradise_pvga1a_init() { @@ -268,7 +277,7 @@ void *paradise_pvga1a_init() NULL, NULL); - mem_mapping_set_handler(¶dise->svga.mapping, paradise_read, NULL, NULL, paradise_write, NULL, NULL); + mem_mapping_set_handler(¶dise->svga.mapping, paradise_read, paradise_readw, NULL, paradise_write, paradise_writew, NULL); mem_mapping_set_p(¶dise->svga.mapping, paradise); svga->crtc[0x31] = 'W'; @@ -299,7 +308,7 @@ void *paradise_wd90c11_init() NULL, NULL); - mem_mapping_set_handler(¶dise->svga.mapping, paradise_read, NULL, NULL, paradise_write, NULL, NULL); + mem_mapping_set_handler(¶dise->svga.mapping, paradise_read, paradise_readw, NULL, paradise_write, paradise_writew, NULL); mem_mapping_set_p(¶dise->svga.mapping, paradise); svga->crtc[0x31] = 'W';