summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/lordgun.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/lordgun.c')
-rw-r--r--src/mame/video/lordgun.c305
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;
+}