diff options
Diffstat (limited to 'src/mame/video/lordgun.c')
-rw-r--r-- | src/mame/video/lordgun.c | 305 |
1 files changed, 305 insertions, 0 deletions
diff --git a/src/mame/video/lordgun.c b/src/mame/video/lordgun.c new file mode 100644 index 00000000000..28e59356418 --- /dev/null +++ b/src/mame/video/lordgun.c @@ -0,0 +1,305 @@ +/*************************************************************************** + + -= IGS Lord Of Gun =- + + driver by Luca Elia (l.elia@tin.it) + + +Note: if MAME_DEBUG is defined, pressing Z with: + + Q / W / E / R Shows Layer 0 / 1 / 2 / 3 + A Shows Sprites + + Keys can be used together! + + + [ 4 Scrolling Layers ] + + Tiles Layer size + + 8 x 8 x 6 0x800 x 0x200 + 8 x 8 x 6 0x200 x 0x100 + 16x16 x 6 0x800 x 0x200 + 32x32 x 6 0x800 x 0x800 + + [ 256 Sprites ] + + Plain 16 x 16 x 6 sprites + + [ 2048 colors ] + + [ Priorities ] + + RAM based priorities, with probably a per tile priority code + (the same sprite goes below some parts, and above others, of the same layer) + +***************************************************************************/ + +#include "driver.h" + +// Variables needed by driver: + +UINT16 *lordgun_vram_0, *lordgun_scroll_x_0, *lordgun_scroll_y_0; +UINT16 *lordgun_vram_1, *lordgun_scroll_x_1, *lordgun_scroll_y_1; +UINT16 *lordgun_vram_2, *lordgun_scroll_x_2, *lordgun_scroll_y_2; +UINT16 *lordgun_vram_3, *lordgun_scroll_x_3, *lordgun_scroll_y_3; +UINT16 *lordgun_scrollram; +int lordgun_whitescreen; + +struct +{ + int scr_x, scr_y; + UINT16 hw_x, hw_y; +} lordgun_gun[2]; + + +/*************************************************************************** + + Tilemaps + +***************************************************************************/ + +static tilemap *tilemap_0, *tilemap_1, *tilemap_2, *tilemap_3; + +static TILE_GET_INFO( get_tile_info_0 ) +{ + UINT16 attr = lordgun_vram_0[ tile_index * 2 + 0 ]; + UINT16 code = lordgun_vram_0[ tile_index * 2 + 1 ]; + SET_TILE_INFO( 1, code, (attr & 0x0030) >> 4, TILE_FLIPXY(attr >> 14)); +} + +static TILE_GET_INFO( get_tile_info_1 ) +{ + UINT16 attr = lordgun_vram_1[ tile_index * 2 + 0 ]; + UINT16 code = lordgun_vram_1[ tile_index * 2 + 1 ]; + SET_TILE_INFO( 2, code, (attr & 0x0070) >> 4, TILE_FLIPXY(attr >> 14)); +} + +static TILE_GET_INFO( get_tile_info_2 ) +{ + UINT16 attr = lordgun_vram_2[ tile_index * 2 + 0 ]; + UINT16 code = lordgun_vram_2[ tile_index * 2 + 1 ]; + SET_TILE_INFO( 3, code, (attr & 0x0300) >> 8, TILE_FLIPXY(attr >> 14)); +} + +static TILE_GET_INFO( get_tile_info_3 ) +{ + UINT16 attr = lordgun_vram_3[ tile_index * 2 + 0 ]; + UINT16 code = lordgun_vram_3[ tile_index * 2 + 1 ]; + SET_TILE_INFO( 4, code, (attr & 0x00f0) >> 4, TILE_FLIPXY(attr >> 14)); +} + +WRITE16_HANDLER( lordgun_vram_0_w ) +{ + COMBINE_DATA(&lordgun_vram_0[offset]); + tilemap_mark_tile_dirty(tilemap_0, offset/2); +} + +WRITE16_HANDLER( lordgun_vram_1_w ) +{ + COMBINE_DATA(&lordgun_vram_1[offset]); + tilemap_mark_tile_dirty(tilemap_1, offset/2); +} + +WRITE16_HANDLER( lordgun_vram_2_w ) +{ + COMBINE_DATA(&lordgun_vram_2[offset]); + tilemap_mark_tile_dirty(tilemap_2, offset/2); +} + +WRITE16_HANDLER( lordgun_vram_3_w ) +{ + COMBINE_DATA(&lordgun_vram_3[offset]); + tilemap_mark_tile_dirty(tilemap_3, offset/2); +} + +/*************************************************************************** + + Video Init + +***************************************************************************/ + +VIDEO_START( lordgun ) +{ + tilemap_0 = tilemap_create( get_tile_info_0, tilemap_scan_rows, + TILEMAP_TYPE_PEN, 8,8, 0x100, 0x40 ); + + tilemap_1 = tilemap_create( get_tile_info_1, tilemap_scan_rows, + TILEMAP_TYPE_PEN, 16,16, 0x80,0x20 ); + + tilemap_2 = tilemap_create( get_tile_info_2, tilemap_scan_rows, + TILEMAP_TYPE_PEN, 32,32, 0x40,0x40 ); + + tilemap_3 = tilemap_create( get_tile_info_3, tilemap_scan_rows, + TILEMAP_TYPE_PEN, 8,8, 0x40,0x20 ); + + tilemap_set_scroll_rows(tilemap_0,1); + tilemap_set_scroll_cols(tilemap_0,1); + tilemap_set_transparent_pen(tilemap_0,0x3f); + + tilemap_set_scroll_rows(tilemap_1,0x200); + tilemap_set_scroll_cols(tilemap_1,1); + tilemap_set_transparent_pen(tilemap_1,0x3f); + + tilemap_set_scroll_rows(tilemap_2,1); + tilemap_set_scroll_cols(tilemap_2,1); + tilemap_set_transparent_pen(tilemap_2,0x3f); + + tilemap_set_scroll_rows(tilemap_3,1); + tilemap_set_scroll_cols(tilemap_3,1); + tilemap_set_transparent_pen(tilemap_3,0x3f); +} + +/*************************************************************************** + + Gun screen position + +***************************************************************************/ + +static int lordgun_gun_x_table[] = +{ + -100, 0x001,0x001,0x002,0x002,0x003,0x003,0x004,0x005,0x006,0x007,0x008,0x009,0x00A,0x00B,0x00C, + 0x00D,0x00E,0x00F,0x010,0x011,0x012,0x013,0x014,0x015,0x016,0x017,0x018,0x019,0x01A,0x01B,0x01C, + 0x01D,0x01E,0x01F,0x020,0x021,0x022,0x023,0x024,0x025,0x026,0x027,0x028,0x029,0x02A,0x02B,0x02C, + 0x02D,0x02E,0x02F,0x030,0x031,0x032,0x033,0x034,0x035,0x036,0x037,0x038,0x039,0x03A,0x03B,0x03C, + 0x03D,0x03E,0x03F,0x040,0x041,0x043,0x044,0x045,0x046,0x047,0x048,0x049,0x04A,0x04B,0x04C,0x04E, + 0x04F,0x050,0x051,0x052,0x053,0x054,0x055,0x056,0x057,0x059,0x05A,0x05B,0x05C,0x05D,0x05E,0x05F, + 0x060,0x061,0x05A,0x063,0x065,0x066,0x067,0x068,0x069,0x06A,0x06B,0x06C,0x06D,0x06E,0x06F,0x071, + 0x072,0x074,0x075,0x077,0x078,0x07A,0x07B,0x07D,0x07E,0x080,0x081,0x083,0x085,0x087,0x089,0x08B, + 0x08D,0x08E,0x08F,0x090,0x092,0x093,0x095,0x097,0x098,0x099,0x09A,0x09B,0x09C,0x09D,0x09E,0x0A0, + 0x0A1,0x0A2,0x0A3,0x0A4,0x0A5,0x0A6,0x0A7,0x0A8,0x0A9,0x0AA,0x0AC,0x0AD,0x0AE,0x0AF,0x0B0,0x0B1, + 0x0B2,0x0B3,0x0B4,0x0B5,0x0B6,0x0B8,0x0B9,0x0BA,0x0BB,0x0BC,0x0BD,0x0BE,0x0BF,0x0C0,0x0C1,0x0C2, + 0x0C4,0x0C5,0x0C6,0x0C7,0x0C8,0x0C9,0x0CA,0x0CB,0x0CC,0x0CD,0x0CF,0x0D0,0x0D1,0x0D2,0x0D3,0x0D4, + 0x0D5,0x0D6,0x0D7,0x0D8,0x0D9,0x0DB,0x0DC,0x0DD,0x0DE,0x0DF,0x0E0,0x0E1,0x0E2,0x0E3,0x0E4,0x0E5, + 0x0E7,0x0E8,0x0E9,0x0EA,0x0EB,0x0EC,0x0ED,0x0EE,0x0EF,0x0F0,0x0F1,0x0F3,0x0F4,0x0F5,0x0F6,0x0F7, + 0x0F8,0x0F9,0x0FA,0x0FB,0x0FC,0x0FE,0x0FF,0x100,0x101,0x102,0x103,0x104,0x105,0x106,0x107,0x108, + 0x10A,0x10B,0x10C,0x10D,0x10E,0x10F,0x110,0x111,0x112,0x113,0x114,0x116,0x117,0x118,0x119,0x11A, + 0x11B,0x11C,0x11D,0x11E,0x11F,0x120,0x122,0x123,0x124,0x125,0x126,0x127,0x128,0x129,0x12A,0x12B, + 0x12C,0x12E,0x12F,0x130,0x131,0x132,0x133,0x134,0x135,0x136,0x137,0x139,0x13A,0x13B,0x13C,0x13D, + 0x13E,0x13F,0x140,0x141,0x142,0x143,0x145,0x146,0x147,0x148,0x149,0x14A,0x14B,0x14C,0x14D,0x14E, + 0x14F,0x151,0x152,0x153,0x154,0x155,0x156,0x157,0x158,0x159,0x15A,0x15B,0x15D,0x15E,0x15F,0x160, + 0x161,0x162,0x163,0x164,0x165,0x166,0x167,0x169,0x16A,0x16B,0x16C,0x16D,0x16E,0x16F,0x170,0x171, + 0x172,0x174,0x175,0x176,0x177,0x178,0x179,0x17A,0x17B,0x17C,0x17D,0x17E,0x17F,0x180,0x181,0x182, + 0x183,0x184,0x185,0x186,0x187,0x188,0x189,0x18A,0x18B,0x18C,0x18D,0x18E,0x18F,0x190,0x191,0x192, + 0x193,0x194,0x195,0x196,0x197,0x198,0x199,0x19A,0x19B,0x19C,0x19D,0x19E,0x19F,0x1A0,0x1A1,0x1A2, + 0x1A3,0x1A4,0x1A5,0x1A6,0x1A7,0x1A8,0x1A9,0x1AA,0x1AB,0x1AC,0x1AD,0x1AE,0x1AF,0x1B0,0x1B1,0x1B2, + 0x1B3,0x1B4,0x1B5,0x1B6,0x1B7,0x1B8,0x1B9,0x1BA,0x1BB,0x1BC,0x1BD,0x1BE,0x1BF,0x1BF +}; + +static void lorddgun_calc_gun_scr(int i) +{ + int x = readinputport(5+i) - 0x3c; + if ( (x < 0) || (x > sizeof(lordgun_gun_x_table)/sizeof(lordgun_gun_x_table[0])) ) + x = 0; + + lordgun_gun[i].scr_x = lordgun_gun_x_table[x]; + lordgun_gun[i].scr_y = readinputport(7+i); +} + +void lordgun_update_gun(int i) +{ + lordgun_gun[i].hw_x = readinputport(5+i); + lordgun_gun[i].hw_y = readinputport(7+i); + + lorddgun_calc_gun_scr(i); + + if ( (lordgun_gun[i].scr_x < Machine->screen[0].visarea.min_x) || + (lordgun_gun[i].scr_x > Machine->screen[0].visarea.max_x) || + (lordgun_gun[i].scr_y < Machine->screen[0].visarea.min_y) || + (lordgun_gun[i].scr_y > Machine->screen[0].visarea.max_y) ) + lordgun_gun[i].hw_x = lordgun_gun[i].hw_y = 0; +} + + +/*************************************************************************** + + Sprites + +***************************************************************************/ + +static void draw_sprites(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect) +{ + UINT16 *s = spriteram16; + UINT16 *end = spriteram16 + spriteram_size/2; + + for ( ; s < end; s += 8/2 ) + { + int attr, code, color, sx, sy, flipx, flipy; + + sy = s[ 0 ]; + attr = s[ 1 ]; + code = s[ 2 ]; + sx = s[ 3 ]; + + // Last sprite + if (sy & 0x8000) break; + + flipx = attr & 0x8000; + flipy = attr & 0x4000; + color = (attr & 0x00f0) >> 4; + + // Sign extend the position + sx -= 0x18; + sy = (sy & 0x7ff) - (sy & 0x800); + + drawgfx( bitmap, machine->gfx[0], + code, color, + flipx, flipy, sx, sy, + cliprect, TRANSPARENCY_PEN, 0x3f); + } +} + +/*************************************************************************** + + Video Update + +***************************************************************************/ + +VIDEO_UPDATE( lordgun ) +{ + int layers_ctrl = -1; + int y; + +#ifdef MAME_DEBUG +if (input_code_pressed(KEYCODE_Z)) +{ + int msk = 0; + + if (input_code_pressed(KEYCODE_Q)) msk |= 1; + if (input_code_pressed(KEYCODE_W)) msk |= 2; + if (input_code_pressed(KEYCODE_E)) msk |= 4; + if (input_code_pressed(KEYCODE_R)) msk |= 8; + if (input_code_pressed(KEYCODE_A)) msk |= 16; + if (msk != 0) layers_ctrl &= msk; +} +#endif + + if (lordgun_whitescreen) + { + fillbitmap( bitmap, get_white_pen(machine), cliprect ); + return 0; + } + + tilemap_set_scrollx( tilemap_0, 0, *lordgun_scroll_x_0 ); + tilemap_set_scrolly( tilemap_0, 0, *lordgun_scroll_y_0 ); + + for (y = 0; y < 0x200; y++) + tilemap_set_scrollx( tilemap_1, y, (*lordgun_scroll_x_1) + lordgun_scrollram[y * 4/2 + 2/2]); + tilemap_set_scrolly( tilemap_1, 0, *lordgun_scroll_y_1 ); + + tilemap_set_scrollx( tilemap_2, 0, *lordgun_scroll_x_2 ); + tilemap_set_scrolly( tilemap_2, 0, *lordgun_scroll_y_2 ); + + tilemap_set_scrollx( tilemap_3, 0, *lordgun_scroll_x_3 ); + tilemap_set_scrolly( tilemap_3, 0, *lordgun_scroll_y_3 ); + + fillbitmap( bitmap, machine->pens[0], cliprect ); + + if (layers_ctrl & 4) tilemap_draw(bitmap, cliprect, tilemap_2, 0, 0); + if (layers_ctrl & 1) tilemap_draw(bitmap, cliprect, tilemap_0, 0, 0); + if (layers_ctrl & 2) tilemap_draw(bitmap, cliprect, tilemap_1, 0, 0); + if (layers_ctrl & 16) draw_sprites(machine, bitmap, cliprect); + if (layers_ctrl & 8) tilemap_draw(bitmap, cliprect, tilemap_3, 0, 0); + + return 0; +} |