From 0b5d8e2e9beece8c45751d93ff057e8799195811 Mon Sep 17 00:00:00 2001 From: Angelo Salese Date: Mon, 12 Sep 2011 21:39:26 +0000 Subject: [PATCH] validity.c better explaination --- src/emu/validity.c | 2 +- src/emu/video/h63484.c | 145 ++++++++++++++++++++++++++--------------- src/mame/drivers/adp.c | 6 +- src/mame/mame_dev.lst | 1 + 4 files changed, 98 insertions(+), 56 deletions(-) diff --git a/src/emu/validity.c b/src/emu/validity.c index acdcb34793d..2fa429efc16 100644 --- a/src/emu/validity.c +++ b/src/emu/validity.c @@ -584,7 +584,7 @@ static bool validate_roms(driver_enumerator &drivlist, region_array *rgninfo, ga } } if (!found) - mame_printf_error("Device %s is not listed in device list\n", source->shortname()); + mame_printf_error("Device %s is not listed in device list (mame_dev.lst / mess_dev.lst)\n", source->shortname()); } } } diff --git a/src/emu/video/h63484.c b/src/emu/video/h63484.c index dbfb895b5f3..88776209f79 100644 --- a/src/emu/video/h63484.c +++ b/src/emu/video/h63484.c @@ -19,15 +19,17 @@ struct _h63484_state h63484_display_pixels_func display_func; screen_device *screen; /* screen */ - UINT8 vram[0x40000]; + UINT8 *vram; UINT8 ar; UINT8 vreg[0x100]; UINT8 sr; - UINT8 fifo[16]; /* FIFO data queue */ - int fifo_flag[16]; /* FIFO flag queue */ - int fifo_ptr; /* FIFO pointer */ - int fifo_dir; /* FIFO direction */ + UINT8 fifo[16]; /* FIFO W data queue */ + int fifo_ptr; /* FIFO W pointer */ + + UINT8 fifo_r[16]; /* FIFO R data queue */ + int fifo_r_ptr; /* FIFO R pointer */ + UINT16 cr; UINT16 pr[9]; /* parameter byte register */ @@ -35,6 +37,8 @@ struct _h63484_state UINT32 rwp; UINT8 rwp_dn; + + address_space *space; /* memory space */ }; enum @@ -344,15 +348,12 @@ INLINE const h63484_interface *get_interface( device_t *device ) } -INLINE void fifo_clear(h63484_state *h63484) +INLINE void fifo_w_clear(h63484_state *h63484) { int i; for (i = 0; i < 16; i++) - { h63484->fifo[i] = 0; - h63484->fifo_flag[i] = FIFO_EMPTY; - } h63484->fifo_ptr = -1; @@ -360,41 +361,17 @@ INLINE void fifo_clear(h63484_state *h63484) h63484->sr |= H63484_SR_WFE; } -INLINE int fifo_param_count(h63484_state *h63484) -{ - int i; - - for (i = 0; i < 16; i++) - { - if (h63484->fifo_flag[i] != FIFO_PARAMETER) break; - } - - return i; -} - -INLINE void fifo_set_direction(h63484_state *h63484, int dir) -{ - if (h63484->fifo_dir != dir) - { - fifo_clear(h63484); - } - - h63484->fifo_dir = dir; -} - -INLINE void queue(h63484_state *h63484, UINT8 data, int flag) +INLINE void queue_w(h63484_state *h63484, UINT8 data) { if (h63484->fifo_ptr < 15) { h63484->fifo_ptr++; h63484->fifo[h63484->fifo_ptr] = data; - h63484->fifo_flag[h63484->fifo_ptr] = flag; if (h63484->fifo_ptr == 16) h63484->sr &= ~H63484_SR_WFR; - //h63484->sr |= H63484_SR_RFR; h63484->sr &= ~H63484_SR_WFE; } else @@ -404,29 +381,23 @@ INLINE void queue(h63484_state *h63484, UINT8 data, int flag) } } -INLINE void dequeue(h63484_state *h63484, UINT8 *data, int *flag) +INLINE void dequeue_w(h63484_state *h63484, UINT8 *data) { int i; *data = h63484->fifo[0]; - *flag = h63484->fifo_flag[0]; //h63484->sr &= ~H63484_SR_RFF; if (h63484->fifo_ptr > -1) { for (i = 0; i < 15; i++) - { h63484->fifo[i] = h63484->fifo[i + 1]; - h63484->fifo_flag[i] = h63484->fifo_flag[i + 1]; - } h63484->fifo[15] = 0; - h63484->fifo_flag[15] = 0; h63484->fifo_ptr--; - //h63484->sr &= ~H63484_SR_RFR; h63484->sr |= H63484_SR_WFR; if (h63484->fifo_ptr == -1) @@ -435,6 +406,62 @@ INLINE void dequeue(h63484_state *h63484, UINT8 *data, int *flag) } } +INLINE void fifo_r_clear(h63484_state *h63484) +{ + int i; + + for (i = 0; i < 16; i++) + h63484->fifo_r[i] = 0; + + h63484->fifo_r_ptr = -1; + + h63484->sr &= ~H63484_SR_RFR; + h63484->sr &= ~H63484_SR_RFF; +} + +INLINE void queue_r(h63484_state *h63484, UINT8 data) +{ + if (h63484->fifo_ptr < 15) + { + h63484->fifo_r_ptr++; + + h63484->fifo_r[h63484->fifo_r_ptr] = data; + + if (h63484->fifo_r_ptr == 16) + h63484->sr |= H63484_SR_RFF; + + h63484->sr |= H63484_SR_RFR; + } + else + { + // TODO what happen? somebody set us up the bomb + printf("FIFO?\n"); + } +} + +INLINE void dequeue_r(h63484_state *h63484, UINT8 *data) +{ + int i; + + *data = h63484->fifo_r[0]; + + if (h63484->fifo_r_ptr > -1) + { + for (i = 0; i < 15; i++) + h63484->fifo_r[i] = h63484->fifo_r[i + 1]; + + h63484->fifo_r[15] = 0; + + h63484->fifo_r_ptr--; + + h63484->sr &= ~H63484_SR_RFF; + + if (h63484->fifo_ptr == -1) + h63484->sr &= H63484_SR_RFR; + + } +} + /*------------------------------------------------- ROM( h63484 ) -------------------------------------------------*/ @@ -574,14 +601,13 @@ static void process_fifo(device_t *device) { h63484_state *h63484 = get_safe_token(device); UINT8 data; - int flag; - dequeue(h63484, &data, &flag); + dequeue_w(h63484, &data); - if (flag == FIFO_COMMAND) + if (h63484->sr & H63484_SR_CED) { h63484->cr = (data & 0xff) << 8; - dequeue(h63484, &data, &flag); + dequeue_w(h63484, &data); h63484->cr |= data & 0xff; h63484->param_ptr = 0; h63484->sr &= ~H63484_SR_CED; @@ -589,7 +615,7 @@ static void process_fifo(device_t *device) else { h63484->pr[h63484->param_ptr] = (data & 0xff) << 8; - dequeue(h63484, &data, &flag); + dequeue_w(h63484, &data); h63484->pr[h63484->param_ptr] |= (data & 0xff); h63484->param_ptr++; } @@ -610,6 +636,18 @@ static void process_fifo(device_t *device) command_end_seq(device); } break; + + case COMMAND_RD: + if (h63484->param_ptr == 0) + { + printf("%08x %02x %02x\n", h63484->rwp,h63484->space->direct().read_raw_byte((h63484->rwp+0) & 0xfffff), h63484->space->direct().read_raw_byte((h63484->rwp+1) & 0xfffff)); + + queue_r(h63484, h63484->space->read_byte((h63484->rwp+0) & 0xfffff)); + queue_r(h63484, h63484->space->read_byte((h63484->rwp+1) & 0xfffff)); + h63484->rwp+=2; + command_end_seq(device); + } + break; } } @@ -617,8 +655,9 @@ static void exec_abort_sequence(device_t *device) { h63484_state *h63484 = get_safe_token(device); - fifo_clear(h63484); - h63484->sr = H63484_SR_WFR | H63484_SR_WFE | H63484_SR_CED; // set to 0x23 + fifo_w_clear(h63484); + fifo_r_clear(h63484); + h63484->sr = H63484_SR_WFR | H63484_SR_WFE | H63484_SR_CED; // hard-set to 0x23 } static void check_video_registers(device_t *device, int offset) @@ -678,9 +717,8 @@ WRITE16_DEVICE_HANDLER( h63484_data_w ) if(h63484->ar == 0) { - fifo_set_direction(h63484, FIFO_WRITE); - queue(h63484, (data & 0xff00) >> 8, (h63484->sr & H63484_SR_CED) >> 5); - queue(h63484, (data & 0x00ff) >> 0, (h63484->sr & H63484_SR_CED) >> 5); + queue_w(h63484, (data & 0xff00) >> 8); + queue_w(h63484, (data & 0x00ff) >> 0); process_fifo(device); } else @@ -702,6 +740,9 @@ static DEVICE_START( h63484 ) h63484->screen = device->machine().device(intf->screen_tag); assert(h63484->screen != NULL); + + h63484->space = device->memory().space(AS_0); + h63484->vram = auto_alloc_array_clear(device->machine(), UINT8, 1 << 20); } static DEVICE_RESET( h63484 ) @@ -718,7 +759,7 @@ DEVICE_GET_INFO( h63484 ) /* --- the following bits of info are returned as 64-bit signed integers --- */ case DEVINFO_INT_TOKEN_BYTES: info->i = sizeof(h63484_state); break; case DEVINFO_INT_DATABUS_WIDTH_0: info->i = 8; break; - case DEVINFO_INT_ADDRBUS_WIDTH_0: info->i = 19; break; + case DEVINFO_INT_ADDRBUS_WIDTH_0: info->i = 20; break; case DEVINFO_INT_ADDRBUS_SHIFT_0: info->i = -1; break; /* --- the following bits of info are returned as pointers --- */ diff --git a/src/mame/drivers/adp.c b/src/mame/drivers/adp.c index e3f2789f839..dad51a3d999 100644 --- a/src/mame/drivers/adp.c +++ b/src/mame/drivers/adp.c @@ -643,12 +643,12 @@ static READ8_HANDLER( h63484_rom_r ) } static ADDRESS_MAP_START( adp_h63484_map, AS_0, 8 ) - AM_RANGE(0x00000, 0x3ffff) AM_DEVREADWRITE("h63484",h63484_vram_r,h63484_vram_w) - AM_RANGE(0x40000, 0x7ffff) AM_READ(h63484_rom_r) + AM_RANGE(0x00000, 0x7ffff) AM_DEVREADWRITE("h63484",h63484_vram_r,h63484_vram_w) + AM_RANGE(0x80000, 0xbffff) AM_READ(h63484_rom_r) ADDRESS_MAP_END static ADDRESS_MAP_START( fashiong_h63484_map, AS_0, 8 ) - AM_RANGE(0x00000, 0x3ffff) AM_DEVREADWRITE("h63484",h63484_vram_r,h63484_vram_w) + AM_RANGE(0x00000, 0x7ffff) AM_DEVREADWRITE("h63484",h63484_vram_r,h63484_vram_w) // AM_RANGE(0x40000, 0x7ffff) AM_ROM AM_REGION("gfx1", 0) ADDRESS_MAP_END diff --git a/src/mame/mame_dev.lst b/src/mame/mame_dev.lst index 0d46b04f086..80aad921547 100644 --- a/src/mame/mame_dev.lst +++ b/src/mame/mame_dev.lst @@ -39,6 +39,7 @@ ******************************************************************************/ BSMT2000 +H63484 NAMCO_50XX NAMCO_51XX NAMCO_52XX