diff options
author | Olivier Galibert <galibert@pobox.com> | 2014-12-16 11:26:18 +0100 |
---|---|---|
committer | Olivier Galibert <galibert@pobox.com> | 2014-12-16 11:26:00 +0100 |
commit | 4a85575e9ae5e4732d9e3c9e5a253302aa6def56 (patch) | |
tree | 5f9e79647a1c28e1e3383afc50a086b390d97755 | |
parent | 7464ac122a9e35ab297f3aa7226363b9bfa68e80 (diff) |
hp16500b: Fix the display ram test [O. Galibert]
-rw-r--r-- | src/mess/drivers/hp16500.c | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/src/mess/drivers/hp16500.c b/src/mess/drivers/hp16500.c index 485e865c6ae..c0c3d1ce1ec 100644 --- a/src/mess/drivers/hp16500.c +++ b/src/mess/drivers/hp16500.c @@ -40,10 +40,10 @@ public: DECLARE_WRITE32_MEMBER(palette_w); - DECLARE_WRITE8_MEMBER(vram_w); - DECLARE_READ8_MEMBER (vram_r); - DECLARE_WRITE8_MEMBER(mask_w); - DECLARE_WRITE8_MEMBER(val_w); + DECLARE_WRITE16_MEMBER(vram_w); + DECLARE_READ8_MEMBER (vram_r); + DECLARE_WRITE8_MEMBER (mask_w); + DECLARE_WRITE8_MEMBER (val_w); INTERRUPT_GEN_MEMBER(vblank); @@ -57,10 +57,10 @@ static ADDRESS_MAP_START(hp16500_map, AS_PROGRAM, 32, hp16500_state) AM_RANGE(0x00200000, 0x0020efff) AM_RAM - AM_RANGE(0x00600000, 0x0061ffff) AM_WRITE8(vram_w, 0x00ff00ff) - AM_RANGE(0x00600000, 0x0067ffff) AM_READ8 (vram_r, 0x00ff00ff) - AM_RANGE(0x00700000, 0x00700003) AM_WRITE8(mask_w, 0xff000000) - AM_RANGE(0x00740000, 0x00740003) AM_WRITE8(val_w, 0xff000000) + AM_RANGE(0x00600000, 0x0061ffff) AM_WRITE16(vram_w, 0xffffffff) + AM_RANGE(0x00600000, 0x0067ffff) AM_READ8 (vram_r, 0x00ff00ff) + AM_RANGE(0x00700000, 0x00700003) AM_WRITE8 (mask_w, 0xff000000) + AM_RANGE(0x00740000, 0x00740003) AM_WRITE8 (val_w, 0xff000000) AM_RANGE(0x00800000, 0x009fffff) AM_RAM ADDRESS_MAP_END @@ -79,8 +79,16 @@ void hp16500_state::video_start() m_val = 0; } -WRITE8_MEMBER(hp16500_state::vram_w) +// The test code is buggy, it writes a byte in the wrong position +// (even instead of odd). It still works because the 68k replicates +// the byte on the word and the hardware doesn't decode UDS/LDS. But +// that is why the handler needs to be 16 bits, or it won't be called +// in the first place. + +WRITE16_MEMBER(hp16500_state::vram_w) { + if(!ACCESSING_BITS_0_7) + data = data | (data >> 8); for(int i=0; i<4; i++) { int off = offset + i * 0x10000; if(data & (8 >> i)) |