summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Angelo Salese <angelosa@users.noreply.github.com>2011-06-14 00:53:46 +0000
committer Angelo Salese <angelosa@users.noreply.github.com>2011-06-14 00:53:46 +0000
commitc422a1a72e9f77121b4a1d932ceaf711c433f17a (patch)
tree1d6afa062bfd8cb3cb86f4ffe5ad961a9161bcf4 /src
parent23976ade94441240db255ecd0f7479bf8bba8694 (diff)
Port from MESS, nw
Diffstat (limited to 'src')
-rw-r--r--src/mame/drivers/saturn.c88
-rw-r--r--src/mame/includes/stv.h20
-rw-r--r--src/mame/video/stvvdp1.c114
-rw-r--r--src/mame/video/stvvdp2.c3
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>();