diff options
| author | 2011-06-14 00:53:46 +0000 | |
|---|---|---|
| committer | 2011-06-14 00:53:46 +0000 | |
| commit | c422a1a72e9f77121b4a1d932ceaf711c433f17a (patch) | |
| tree | 1d6afa062bfd8cb3cb86f4ffe5ad961a9161bcf4 /src | |
| parent | 23976ade94441240db255ecd0f7479bf8bba8694 (diff) | |
Port from MESS, nw
Diffstat (limited to 'src')
| -rw-r--r-- | src/mame/drivers/saturn.c | 88 | ||||
| -rw-r--r-- | src/mame/includes/stv.h | 20 | ||||
| -rw-r--r-- | src/mame/video/stvvdp1.c | 114 | ||||
| -rw-r--r-- | src/mame/video/stvvdp2.c | 3 |
4 files changed, 139 insertions, 86 deletions
diff --git a/src/mame/drivers/saturn.c b/src/mame/drivers/saturn.c index 03d5d9c74e3..2365065c646 100644 --- a/src/mame/drivers/saturn.c +++ b/src/mame/drivers/saturn.c @@ -149,6 +149,7 @@ static struct UINT8 abus; }stv_irq; +static void scu_do_transfer(running_machine &machine,UINT8 event); static void scu_dma_direct(address_space *space, UINT8 dma_ch); /*DMA level 0 direct transfer function*/ static void scu_dma_indirect(address_space *space, UINT8 dma_ch); /*DMA level 0 indirect transfer function*/ @@ -1189,11 +1190,8 @@ xxxx xxxx x--- xx-- xx-- xx-- xx-- xx-- UNUSED **********************************************************************************/ /* DMA TODO: --Verify if there are any kind of bugs,do clean-ups,use better comments - and macroize for better reading... -Add timings(but how fast are each DMA?). -Add level priority & DMA status register. --Add DMA start factor conditions that are different than 7. -Add byte data type transfer. -Set boundaries. */ @@ -1219,6 +1217,22 @@ static UINT32 scu_add_tmp; #define WORK_RAM_H(_lv_) ((scu_##_lv_ & 0x07ffffff) >= 0x06000000) && ((scu_##_lv_ & 0x07ffffff) <= 0x060fffff) #define SOUND_RAM(_lv_) ((scu_##_lv_ & 0x07ffffff) >= 0x05a00000) && ((scu_##_lv_ & 0x07ffffff) <= 0x05afffff) +static void scu_do_transfer(running_machine &machine,UINT8 event) +{ + saturn_state *state = machine.driver_data<saturn_state>(); + address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); + int i; + + for(i=0;i<3;i++) + { + if(state->m_scu.enable_mask[i] && state->m_scu.start_factor[i] == event) + { + if(DIRECT_MODE(i)) { scu_dma_direct(space,i); } + else { scu_dma_indirect(space,i); } + } + } +} + static READ32_HANDLER( saturn_scu_r ) { saturn_state *state = space->machine().driver_data<saturn_state>(); @@ -1304,11 +1318,11 @@ static WRITE32_HANDLER( saturn_scu_w ) It must be 7 for this specific condition. -state->m_scu_regs[5] bit 24 is Indirect Mode/Direct Mode (0/1). */ - if(state->m_scu_regs[offset] & 1 && ((state->m_scu_regs[offset+1] & 7) == 7) && state->m_scu_regs[offset] & 0x100) + state->m_scu.enable_mask[DMA_CH] = (data & 0x100) >> 8; + if(state->m_scu.enable_mask[DMA_CH] && state->m_scu.start_factor[DMA_CH] == 7 && state->m_scu_regs[offset] & 1) { if(DIRECT_MODE(DMA_CH)) { scu_dma_direct(space,DMA_CH); } - else { scu_dma_indirect(space,DMA_CH); } - + else { scu_dma_indirect(space,DMA_CH); } state->m_scu_regs[offset]&=~1;//disable starting bit. } break; @@ -1320,8 +1334,7 @@ static WRITE32_HANDLER( saturn_scu_w ) } /*Start factor enable bits,bit 2,bit 1 and bit 0*/ - if((state->m_scu_regs[offset] & 7) != 7) - if(LOG_SCU) logerror("Start factor chosen for lv %d = %d\n",state->m_scu_regs[offset+1] & 7,DMA_CH); + state->m_scu.start_factor[DMA_CH] = state->m_scu_regs[offset] & 7; break; case 24: @@ -1753,7 +1766,7 @@ static ADDRESS_MAP_START( saturn_mem, AS_PROGRAM, 32 ) /* VDP1 */ AM_RANGE(0x05c00000, 0x05c7ffff) AM_READWRITE(saturn_vdp1_vram_r, saturn_vdp1_vram_w) AM_RANGE(0x05c80000, 0x05cbffff) AM_READWRITE(saturn_vdp1_framebuffer0_r, saturn_vdp1_framebuffer0_w) - AM_RANGE(0x05d00000, 0x05d0001f) AM_READWRITE(saturn_vdp1_regs_r, saturn_vdp1_regs_w) + AM_RANGE(0x05d00000, 0x05d0001f) AM_READWRITE16(saturn_vdp1_regs_r, saturn_vdp1_regs_w,0xffffffff) AM_RANGE(0x05e00000, 0x05efffff) AM_READWRITE(saturn_vdp2_vram_r, saturn_vdp2_vram_w) AM_RANGE(0x05f00000, 0x05f7ffff) AM_READWRITE(saturn_vdp2_cram_r, saturn_vdp2_cram_w) AM_RANGE(0x05f80000, 0x05fbffff) AM_READWRITE(saturn_vdp2_regs_r, saturn_vdp2_regs_w) @@ -1781,7 +1794,7 @@ static ADDRESS_MAP_START( stv_mem, AS_PROGRAM, 32 ) /* VDP1 */ AM_RANGE(0x05c00000, 0x05c7ffff) AM_READWRITE(saturn_vdp1_vram_r, saturn_vdp1_vram_w) AM_RANGE(0x05c80000, 0x05cbffff) AM_READWRITE(saturn_vdp1_framebuffer0_r, saturn_vdp1_framebuffer0_w) - AM_RANGE(0x05d00000, 0x05d0001f) AM_READWRITE(saturn_vdp1_regs_r, saturn_vdp1_regs_w) + AM_RANGE(0x05d00000, 0x05d0001f) AM_READWRITE16(saturn_vdp1_regs_r, saturn_vdp1_regs_w,0xffffffff) AM_RANGE(0x05e00000, 0x05efffff) AM_READWRITE(saturn_vdp2_vram_r, saturn_vdp2_vram_w) AM_RANGE(0x05f00000, 0x05f7ffff) AM_READWRITE(saturn_vdp2_cram_r, saturn_vdp2_cram_w) AM_RANGE(0x05f80000, 0x05fbffff) AM_READWRITE(saturn_vdp2_regs_r, saturn_vdp2_regs_w) @@ -2364,7 +2377,11 @@ static WRITE_LINE_DEVICE_HANDLER( scsp_to_main_irq ) { saturn_state *drvstate = device->machine().driver_data<saturn_state>(); - device_set_input_line_and_vector(drvstate->m_maincpu, 9, (stv_irq.sound_req) ? HOLD_LINE : CLEAR_LINE, 0x46); + if(stv_irq.sound_req) + { + device_set_input_line_and_vector(drvstate->m_maincpu, 9, HOLD_LINE, 0x46); + scu_do_transfer(device->machine(),5); + } } static const scsp_interface scsp_config = @@ -2569,27 +2586,54 @@ static TIMER_DEVICE_CALLBACK( saturn_scanline ) if(scanline == 0*y_step) { - device_set_input_line_and_vector(state->m_maincpu, 0xe, (stv_irq.vblank_out) ? HOLD_LINE : CLEAR_LINE , 0x41); - //CEF_0; //TODO + if(stv_irq.vblank_out) + { + device_set_input_line_and_vector(state->m_maincpu, 0xe, (stv_irq.vblank_out) ? HOLD_LINE : CLEAR_LINE , 0x41); + scu_do_transfer(timer.machine(),1); + } } else if(scanline == vblank_line*y_step) { - device_set_input_line_and_vector(state->m_maincpu, 0xf, (stv_irq.vblank_in) ? HOLD_LINE : CLEAR_LINE , 0x40); - video_update_vdp1(timer.machine()); + if(stv_irq.vblank_in) + { + device_set_input_line_and_vector(state->m_maincpu, 0xf, HOLD_LINE ,0x40); + scu_do_transfer(timer.machine(),0); + } + if(stv_irq.vdp1_end) + { device_set_input_line_and_vector(state->m_maincpu, 0x2, HOLD_LINE, 0x4d); - CEF_1; + scu_do_transfer(timer.machine(),6); + } + video_update_vdp1(timer.machine()); } else if((scanline % y_step) == 0 && scanline < vblank_line*y_step) - device_set_input_line_and_vector(state->m_maincpu, 0xd, (stv_irq.hblank_in) ? HOLD_LINE : CLEAR_LINE, 0x42); - - /* TODO: this isn't completely correct */ - if((state->m_scu_regs[38] & 0x81) == 0x01 && ((scanline % y_step) == 0)) - device_set_input_line_and_vector(state->m_maincpu, 0xb, (stv_irq.timer_1) ? HOLD_LINE : CLEAR_LINE, 0x44 ); + { + if(stv_irq.hblank_in) + { + device_set_input_line_and_vector(state->m_maincpu, 0xd, HOLD_LINE, 0x42); + scu_do_transfer(timer.machine(),2); + } + } if(scanline == (state->m_scu_regs[36] & 0x3ff)*y_step) - device_set_input_line_and_vector(state->m_maincpu, 0xc, (stv_irq.timer_0) ? HOLD_LINE : CLEAR_LINE, 0x43 ); + { + if(stv_irq.timer_0) + { + device_set_input_line_and_vector(state->m_maincpu, 0xc, HOLD_LINE, 0x43 ); + scu_do_transfer(timer.machine(),3); + } + } + /* TODO: this isn't completely correct */ + if((state->m_scu_regs[38] & 0x81) == 0x01 && ((scanline % y_step) == 0)) + { + if(stv_irq.timer_1) + { + device_set_input_line_and_vector(state->m_maincpu, 0xb, HOLD_LINE, 0x44 ); + scu_do_transfer(timer.machine(),4); + } + } } static READ32_HANDLER( saturn_cart_dram0_r ) diff --git a/src/mame/includes/stv.h b/src/mame/includes/stv.h index c6e896337ce..47fba5e2c4c 100644 --- a/src/mame/includes/stv.h +++ b/src/mame/includes/stv.h @@ -17,7 +17,7 @@ public: UINT32 *m_vdp2_vram; UINT32 *m_vdp2_cram; UINT32 *m_vdp1_vram; - UINT32 *m_vdp1_regs; + UINT16 *m_vdp1_regs; UINT8 m_NMI_reset; UINT8 m_en_68k; @@ -29,6 +29,8 @@ public: UINT32 dst_add[3]; /* Destination Addition for DMA lv n*/ INT32 size[3]; /* Transfer DMA size lv n*/ UINT32 index[3]; + UINT8 start_factor[3]; + UINT8 enable_mask[3]; }m_scu; int m_minit_boost; @@ -96,10 +98,14 @@ public: #define MASTER_CLOCK_352 57272800 #define MASTER_CLOCK_320 53748200 -#define CEF_1 state->m_vdp1_regs[0x010/4]|=0x00020000 -#define CEF_0 state->m_vdp1_regs[0x010/4]&=~0x00020000 -#define BEF_1 state->m_vdp1_regs[0x010/4]|=0x00010000 -#define BEF_0 state->m_vdp1_regs[0x010/4]&=~0x00010000 +#define CEF_1 state->m_vdp1_regs[0x010/2]|=0x0002 +#define CEF_0 state->m_vdp1_regs[0x010/2]&=~0x0002 +#define BEF_1 state->m_vdp1_regs[0x010/2]|=0x0001 +#define BEF_0 state->m_vdp1_regs[0x010/2]&=~0x0001 +#define STV_VDP1_TVMR ((state->m_vdp1_regs[0x000/2])&0xffff) +#define STV_VDP1_VBE ((STV_VDP1_TVMR & 0x0008) >> 3) +#define STV_VDP1_TVM ((STV_VDP1_TVMR & 0x0007) >> 0) + DRIVER_INIT ( stv ); @@ -159,11 +165,11 @@ int stv_vdp1_start ( running_machine &machine ); void video_update_vdp1(running_machine &machine); void stv_vdp2_dynamic_res_change(running_machine &machine); -READ32_HANDLER ( saturn_vdp1_regs_r ); +READ16_HANDLER ( saturn_vdp1_regs_r ); READ32_HANDLER ( saturn_vdp1_vram_r ); READ32_HANDLER ( saturn_vdp1_framebuffer0_r ); -WRITE32_HANDLER ( saturn_vdp1_regs_w ); +WRITE16_HANDLER ( saturn_vdp1_regs_w ); WRITE32_HANDLER ( saturn_vdp1_vram_w ); WRITE32_HANDLER ( saturn_vdp1_framebuffer0_w ); diff --git a/src/mame/video/stvvdp1.c b/src/mame/video/stvvdp1.c index 730dd89bf7e..048980cbd50 100644 --- a/src/mame/video/stvvdp1.c +++ b/src/mame/video/stvvdp1.c @@ -90,9 +90,6 @@ struct shaded_point 1 1024x256 0 512x256 */ -#define STV_VDP1_TVMR ((state->m_vdp1_regs[0x000/4] >> 16)&0x0000ffff) -#define STV_VDP1_VBE ((STV_VDP1_TVMR & 0x0008) >> 3) -#define STV_VDP1_TVM ((STV_VDP1_TVMR & 0x0007) >> 0) /*Frame Buffer Change Mode Register*/ /* @@ -103,7 +100,7 @@ struct shaded_point ---- ---- ---- --x- | Frame Buffer Change Trigger (FCM) ---- ---- ---- ---x | Frame Buffer Change Mode (FCT) */ -#define STV_VDP1_FBCR ((state->m_vdp1_regs[0x000/4] >> 0)&0x0000ffff) +#define STV_VDP1_FBCR ((state->m_vdp1_regs[0x002/2] >> 0)&0xffff) #define STV_VDP1_EOS ((STV_VDP1_FBCR & 0x0010) >> 4) #define STV_VDP1_DIE ((STV_VDP1_FBCR & 0x0008) >> 3) #define STV_VDP1_DIL ((STV_VDP1_FBCR & 0x0004) >> 2) @@ -121,9 +118,17 @@ struct shaded_point 1 VDP1 draw by request 0 VDP1 Idle (no access) */ -#define STV_VDP1_PTMR ((state->m_vdp1_regs[0x004/4] >> 16)&0x0000ffff) +#define STV_VDP1_PTMR ((state->m_vdp1_regs[0x004/2])&0xffff) #define STV_VDP1_PTM ((STV_VDP1_PTMR & 0x0003) >> 0) -#define PTM_0 state->m_vdp1_regs[0x004/4]&=~0x00010000 +#define PTM_0 state->m_vdp1_regs[0x004/2]&=~0x0001 + +/* + Erase/Write Data Register + 16 bpp = data + 8 bpp = erase/write data for even/odd X coordinates +*/ +#define STV_VDP1_EWDR ((state->m_vdp1_regs[0x006/2])&0xffff) + /*Erase/Write Upper-Left register*/ /* x--- ---- ---- ---- | UNUSED @@ -131,7 +136,7 @@ struct shaded_point ---- ---x xxxx xxxx | Y1 register */ -#define STV_VDP1_EWLR ((state->m_vdp1_regs[0x008/4] >> 16)&0x0000ffff) +#define STV_VDP1_EWLR ((state->m_vdp1_regs[0x008/2])&0xffff) #define STV_VDP1_EWLR_X1 ((STV_VDP1_EWLR & 0x7e00) >> 9) #define STV_VDP1_EWLR_Y1 ((STV_VDP1_EWLR & 0x01ff) >> 0) /*Erase/Write Lower-Right register*/ @@ -140,7 +145,7 @@ struct shaded_point ---- ---x xxxx xxxx | Y3 register */ -#define STV_VDP1_EWRR ((state->m_vdp1_regs[0x008/4] >> 0)&0x0000ffff) +#define STV_VDP1_EWRR ((state->m_vdp1_regs[0x00a/2])&0xffff) #define STV_VDP1_EWRR_X3 ((STV_VDP1_EWRR & 0xfe00) >> 9) #define STV_VDP1_EWRR_Y3 ((STV_VDP1_EWRR & 0x01ff) >> 0) /*Transfer End Status Register*/ @@ -150,7 +155,7 @@ struct shaded_point ---- ---- ---- ---x | BEF */ -#define STV_VDP1_EDSR ((state->m_vdp1_regs[0x010/4] >> 16)&0x0000ffff) +#define STV_VDP1_EDSR ((state->m_vdp1_regs[0x010/2])&0xffff) #define STV_VDP1_CEF (STV_VDP1_EDSR & 2) #define STV_VDP1_BEF (STV_VDP1_EDSR & 1) /**/ @@ -159,13 +164,25 @@ struct shaded_point static void stv_vdp1_process_list(running_machine &machine); -READ32_HANDLER( saturn_vdp1_regs_r ) +READ16_HANDLER( saturn_vdp1_regs_r ) { saturn_state *state = space->machine().driver_data<saturn_state>(); //logerror ("cpu %s (PC=%08X) VDP1: Read from Registers, Offset %04x\n", space->device().tag(), cpu_get_pc(&space->device()), offset); - return state->m_vdp1_regs[offset]; + switch(offset) + { + case 0x10/2: + break; + case 0x12/2: + case 0x14/2: + case 0x16/2: + printf ("cpu %s (PC=%08X) VDP1: Read from Registers, Offset %04x\n", space->device().tag(), cpu_get_pc(&space->device()), offset); + + break; + } + + return state->m_vdp1_regs[offset]; //TODO: write-only regs should return open bus or zero } static void stv_clear_framebuffer( running_machine &machine, int which_framebuffer ) @@ -254,58 +271,46 @@ static void stv_set_framebuffer_config( running_machine &machine ) stv_prepare_framebuffers(machine); } -WRITE32_HANDLER( saturn_vdp1_regs_w ) +WRITE16_HANDLER( saturn_vdp1_regs_w ) { saturn_state *state = space->machine().driver_data<saturn_state>(); COMBINE_DATA(&state->m_vdp1_regs[offset]); - if ( offset == 0 ) + + switch(offset) { - stv_set_framebuffer_config(space->machine()); - if ( ACCESSING_BITS_0_15 ) - { - if ( VDP1_LOG ) logerror( "VDP1: Access to register FBCR = %1X\n", STV_VDP1_FBCR ); - state->m_vdp1.fbcr_accessed = 1; - } - else - { + case 0x00/2: + stv_set_framebuffer_config(space->machine()); if ( VDP1_LOG ) logerror( "VDP1: Access to register TVMR = %1X\n", STV_VDP1_TVMR ); if ( STV_VDP1_VBE && get_vblank(space->machine()) ) - { state->m_vdp1.framebuffer_clear_on_next_frame = 1; - } - /* needed by pblbeach, it doesn't clear local coordinates in its sprite list...*/ - //if ( !strcmp(space->machine().system().name, "pblbeach") ) - //{ - // state->m_vdp1.local_x = state->m_vdp1.local_y = 0; - //} - } - } - else if ( offset == 1 ) - { - if ( ACCESSING_BITS_16_31 ) - { + break; + case 0x02/2: + stv_set_framebuffer_config(space->machine()); + if ( VDP1_LOG ) logerror( "VDP1: Access to register FBCR = %1X\n", STV_VDP1_FBCR ); + state->m_vdp1.fbcr_accessed = 1; + break; + case 0x04/2: + if ( VDP1_LOG ) logerror( "VDP1: Access to register PTMR = %1X\n", STV_VDP1_PTM ); if ( STV_VDP1_PTMR == 1 ) - { - if ( VDP1_LOG ) logerror( "VDP1: Access to register PTMR = %1X\n", STV_VDP1_PTMR ); stv_vdp1_process_list( space->machine() ); - } - } - else if ( ACCESSING_BITS_0_15 ) - { + + break; + case 0x06/2: if ( VDP1_LOG ) logerror( "VDP1: Erase data set %08X\n", data ); - } - } - else if ( offset == 2 ) - { - if ( ACCESSING_BITS_16_31 ) - { + + if(data) + popmessage("EWDR set %08x, contact MAMEdev",STV_VDP1_EWDR); + break; + case 0x08/2: if ( VDP1_LOG ) logerror( "VDP1: Erase upper-left coord set: %08X\n", data ); - } - else if ( ACCESSING_BITS_0_15 ) - { + break; + case 0x0a/2: if ( VDP1_LOG ) logerror( "VDP1: Erase lower-right coord set: %08X\n", data ); - } + break; + default: + printf("Warning: write to unknown VDP1 reg %08x %08x\n",offset*2,data); + break; } } @@ -1767,7 +1772,7 @@ static void stv_vdp1_process_list(running_machine &machine) stv_clear_gouraud_shading(); /*Set CEF bit to 0*/ - //CEF_0; + CEF_0; while (spritecount<10000) // if its drawn this many sprites something is probably wrong or sega were crazy ;-) { @@ -1973,6 +1978,8 @@ static void stv_vdp1_process_list(running_machine &machine) end: + /* set CEF to 1*/ + CEF_1; if (VDP1_LOG) logerror ("End of list processing!\n"); } @@ -2055,7 +2062,6 @@ void video_update_vdp1(running_machine &machine) if ( framebuffer_changed ) { /*set CEF to 1*/ - //CEF_1; stv_vdp1_process_list(machine); } break; @@ -2092,7 +2098,7 @@ static void stv_vdp1_state_save_postload(running_machine &machine) int stv_vdp1_start ( running_machine &machine ) { saturn_state *state = machine.driver_data<saturn_state>(); - state->m_vdp1_regs = auto_alloc_array_clear(machine, UINT32, 0x040000/4 ); + state->m_vdp1_regs = auto_alloc_array_clear(machine, UINT16, 0x020/2 ); state->m_vdp1_vram = auto_alloc_array_clear(machine, UINT32, 0x100000/4 ); state->m_vdp1.gfx_decode = auto_alloc_array(machine, UINT8, 0x100000 ); @@ -2119,7 +2125,7 @@ int stv_vdp1_start ( running_machine &machine ) state->m_vdp1.user_cliprect.min_y = state->m_vdp1.user_cliprect.max_y = 0; // save state - state_save_register_global_pointer(machine, state->m_vdp1_regs, 0x040000/4); + state_save_register_global_pointer(machine, state->m_vdp1_regs, 0x020/2); state_save_register_global_pointer(machine, state->m_vdp1_vram, 0x100000/4); state_save_register_global(machine, state->m_vdp1.fbcr_accessed); state_save_register_global(machine, state->m_vdp1.framebuffer_current_display); diff --git a/src/mame/video/stvvdp2.c b/src/mame/video/stvvdp2.c index 6acc2e53b26..5f9c9d6f176 100644 --- a/src/mame/video/stvvdp2.c +++ b/src/mame/video/stvvdp2.c @@ -5812,9 +5812,6 @@ static int stv_sprite_priorities_used[8]; static int stv_sprite_priorities_usage_valid; static UINT8 stv_sprite_priorities_in_fb_line[512][8]; -#define STV_VDP1_TVMR ((state->m_vdp1_regs[0x000/4] >> 16)&0x0000ffff) -#define STV_VDP1_TVM ((STV_VDP1_TVMR & 0x0007) >> 0) - static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT8 pri) { saturn_state *state = machine.driver_data<saturn_state>(); |
