Added clock information and timing from schematics to bagman.c Improved interrupt timing and handling to follow schematics. [Couriersud]

This commit is contained in:
Couriersud 2010-06-01 21:18:36 +00:00
parent 44fff691fe
commit 3d0dfafba4
3 changed files with 49 additions and 25 deletions

View File

@ -66,7 +66,6 @@ DIP locations verified for:
#include "sound/tms5110.h"
#include "includes/bagman.h"
//static int speech_rom_address = 0;
static UINT8 ls259_buf[8] = {0,0,0,0,0,0,0,0};
@ -88,6 +87,7 @@ static WRITE8_DEVICE_HANDLER( bagman_ls259_w )
tmsprom_bit_w(device, 0, (ls259_buf[0]<<2) | (ls259_buf[1]<<1) | (ls259_buf[2]<<0));
break;
case 3:
//printf("Speech %d\n", ls259_buf[offset]);
tmsprom_enable_w(device, ls259_buf[offset]);
break;
case 4:
@ -105,6 +105,14 @@ static WRITE8_HANDLER( bagman_coin_counter_w )
coin_counter_w(space->machine, offset,data);
}
static WRITE8_DEVICE_HANDLER( bagman_interrupt_w )
{
data &= 1;
if (!data)
cpu_set_input_line(device, 0, CLEAR_LINE);
cpu_interrupt_enable(device, data);
}
static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x5fff) AM_ROM
AM_RANGE(0x6000, 0x67ff) AM_RAM
@ -113,7 +121,7 @@ static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x9c00, 0x9fff) AM_WRITENOP /* written to, but unused */
AM_RANGE(0xa000, 0xa000) AM_READ(bagman_pal16r6_r)
//AM_RANGE(0xa800, 0xa805) AM_READ(bagman_ls259_r) /*just for debugging purposes*/
AM_RANGE(0xa000, 0xa000) AM_WRITE(interrupt_enable_w)
AM_RANGE(0xa000, 0xa000) AM_DEVWRITE("maincpu", bagman_interrupt_w)
AM_RANGE(0xa001, 0xa002) AM_WRITE(bagman_flipscreen_w)
AM_RANGE(0xa003, 0xa003) AM_WRITEONLY AM_BASE(&bagman_video_enable)
AM_RANGE(0xc000, 0xffff) AM_ROM /* Super Bagman only */
@ -123,7 +131,7 @@ static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0xa800, 0xa805) AM_DEVWRITE("tmsprom", bagman_ls259_w) /* TMS5110 driving state machine */
AM_RANGE(0xa004, 0xa004) AM_WRITE(bagman_coin_counter_w)
AM_RANGE(0xb000, 0xb000) AM_READ_PORT("DSW")
AM_RANGE(0xb800, 0xb800) AM_READNOP
AM_RANGE(0xb800, 0xb800) AM_READNOP /* looks like watchdog from schematics */
#if 0
AM_RANGE(0xa007, 0xa007) AM_WRITENOP /* ???? */
@ -463,20 +471,17 @@ static const tms5110_interface bagman_tms5110_interface =
static MACHINE_DRIVER_START( bagman )
/* basic machine hardware */
MDRV_CPU_ADD("maincpu", Z80, 3072000) /* 3.072 MHz (?) */
MDRV_CPU_ADD("maincpu", Z80, BAGMAN_M1Q)
MDRV_CPU_PROGRAM_MAP(main_map)
MDRV_CPU_IO_MAP(main_portmap)
MDRV_CPU_VBLANK_INT("screen", irq0_line_hold)
MDRV_CPU_VBLANK_INT("screen", irq0_line_assert)
MDRV_MACHINE_RESET(bagman)
/* video hardware */
MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(60)
MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_SCREEN_SIZE(32*8, 32*8)
MDRV_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
MDRV_SCREEN_RAW_PARAMS(BAGMAN_HCLK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART)
MDRV_GFXDECODE(bagman)
MDRV_PALETTE_LENGTH(64)
@ -490,7 +495,7 @@ static MACHINE_DRIVER_START( bagman )
/* sound hardware */
MDRV_SPEAKER_STANDARD_MONO("mono")
MDRV_SOUND_ADD("aysnd", AY8910, 1500000)
MDRV_SOUND_ADD("aysnd", AY8910, BAGMAN_H0 / 2)
MDRV_SOUND_CONFIG(ay8910_config)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.10)
@ -502,7 +507,7 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( pickin )
/* basic machine hardware */
MDRV_CPU_ADD("maincpu", Z80, 3072000) /* 3.072 MHz (?) */
MDRV_CPU_ADD("maincpu", Z80, BAGMAN_M1Q)
MDRV_CPU_PROGRAM_MAP(pickin_map)
MDRV_CPU_IO_MAP(main_portmap)
MDRV_CPU_VBLANK_INT("screen", irq0_line_hold)
@ -511,11 +516,8 @@ static MACHINE_DRIVER_START( pickin )
/* video hardware */
MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(60)
MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MDRV_SCREEN_RAW_PARAMS(BAGMAN_HCLK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART)
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_SCREEN_SIZE(32*8, 32*8)
MDRV_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
MDRV_GFXDECODE(pickin)
MDRV_PALETTE_LENGTH(64)
@ -557,7 +559,7 @@ z80
static MACHINE_DRIVER_START( botanic )
/* basic machine hardware */
MDRV_CPU_ADD("maincpu", Z80, 3072000) /* 3.072 MHz (?) */
MDRV_CPU_ADD("maincpu", Z80, BAGMAN_M1Q)
MDRV_CPU_PROGRAM_MAP(pickin_map)
MDRV_CPU_IO_MAP(main_portmap)
MDRV_CPU_VBLANK_INT("screen", irq0_line_hold)
@ -566,11 +568,9 @@ static MACHINE_DRIVER_START( botanic )
/* video hardware */
MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(60)
MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_SCREEN_SIZE(32*8, 32*8)
MDRV_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
MDRV_SCREEN_RAW_PARAMS(BAGMAN_HCLK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART)
MDRV_GFXDECODE(bagman)
MDRV_PALETTE_LENGTH(64)

View File

@ -1,3 +1,25 @@
/*----------- timings -----------*/
#define BAGMAN_MAIN_CLOCK XTAL_18_432MHz
#define BAGMAN_HCLK (BAGMAN_MAIN_CLOCK / 3)
#define BAGMAN_H0 (BAGMAN_HCLK / 2)
#define BAGMAN_H1 (BAGMAN_H0 / 2)
#define BAGMAN_M1Q (BAGMAN_H1) /* inverted H1 */
#define HTOTAL ((0x100-0x40)*2)
#define HBEND (0x00)
#define HBSTART (0x100)
#define VTOTAL ((0x100-0x7c)*2)
/* the following VBEND/VBSTART are used for compsync
* #define VBEND (0x08)
* #define VBSTART (0x100)
*
* However VBSYQ (and INTQ) is generated using the following values:
*/
#define VBEND (0x0f)
#define VBSTART (0xef)
/*----------- defined in machine/bagman.c -----------*/
READ8_HANDLER( bagman_pal16r6_r );

View File

@ -121,27 +121,27 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
sx = spriteram[offs + 3];
sy = 240 - spriteram[offs + 2];
sy = 255 - spriteram[offs + 2] - 16;
flipx = spriteram[offs] & 0x40;
flipy = spriteram[offs] & 0x80;
if (flip_screen_x_get(machine))
{
sx = 240 - sx +1; /* compensate misplacement */
sx = 256 - sx - 15;
flipx = !flipx;
}
if (flip_screen_y_get(machine))
{
sy = 240 - sy;
sy = 255 - sy - 8;
flipy = !flipy;
}
if (spriteram[offs + 2] && spriteram[offs + 3])
drawgfx_transpen(bitmap,/* compensate misplacement */
drawgfx_transpen(bitmap,
cliprect,machine->gfx[1],
(spriteram[offs] & 0x3f) + 2 * (spriteram[offs + 1] & 0x20),
spriteram[offs + 1] & 0x1f,
flipx,flipy,
sx,sy+1,0);
sx,sy,0);
}
}
@ -151,6 +151,8 @@ VIDEO_UPDATE( bagman )
if (*bagman_video_enable == 0)
return 0;
tilemap_set_scrolldx(bg_tilemap, 0, -128);
tilemap_set_scrolldy(bg_tilemap, -1, 0);
tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0);
draw_sprites(screen->machine, bitmap, cliprect);
return 0;