summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/yunsung8.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/yunsung8.c')
-rw-r--r--src/mame/video/yunsung8.c206
1 files changed, 206 insertions, 0 deletions
diff --git a/src/mame/video/yunsung8.c b/src/mame/video/yunsung8.c
new file mode 100644
index 00000000000..f5e80d04132
--- /dev/null
+++ b/src/mame/video/yunsung8.c
@@ -0,0 +1,206 @@
+/***************************************************************************
+
+ -= Yun Sung 8 Bit Games =-
+
+ driver by Luca Elia (l.elia@tin.it)
+
+
+Note: if MAME_DEBUG is defined, pressing Z with:
+
+ Q shows the background layer
+ W shows the foreground layer
+
+ [ 2 Fixed Layers ]
+
+ [ Background ]
+
+ Layer Size: 512 x 256
+ Tiles: 8 x 8 x 8
+
+ [ Foreground ]
+
+ Layer Size: 512 x 256
+ Tiles: 8 x 8 x 4
+
+
+ There are no sprites.
+
+***************************************************************************/
+
+#include "driver.h"
+
+/* Variables that driver has access to: */
+
+UINT8 *yunsung8_videoram_0, *yunsung8_videoram_1;
+int yunsung8_layers_ctrl;
+
+/* Variables only used here: */
+
+static tilemap *tilemap_0, *tilemap_1;
+static int yunsung8_videobank;
+
+
+/***************************************************************************
+
+ Memory Handlers
+
+***************************************************************************/
+
+WRITE8_HANDLER( yunsung8_videobank_w )
+{
+ yunsung8_videobank = data;
+}
+
+
+READ8_HANDLER( yunsung8_videoram_r )
+{
+ int bank;
+
+ /* Bit 1 of the bankswitching register contols the c000-c7ff
+ area (Palette). Bit 0 controls the c800-dfff area (Tiles) */
+
+ if (offset < 0x0800) bank = yunsung8_videobank & 2;
+ else bank = yunsung8_videobank & 1;
+
+ if (bank) return yunsung8_videoram_0[offset];
+ else return yunsung8_videoram_1[offset];
+}
+
+
+WRITE8_HANDLER( yunsung8_videoram_w )
+{
+ if (offset < 0x0800) // c000-c7ff Banked Palette RAM
+ {
+ int bank = yunsung8_videobank & 2;
+ UINT8 *RAM;
+ int color;
+
+ if (bank) RAM = yunsung8_videoram_0;
+ else RAM = yunsung8_videoram_1;
+
+ RAM[offset] = data;
+ color = RAM[offset & ~1] | (RAM[offset | 1] << 8);
+
+ /* BBBBBGGGGGRRRRRx */
+ palette_set_color_rgb(Machine, offset/2 + (bank ? 0x400:0), pal5bit(color >> 0), pal5bit(color >> 5), pal5bit(color >> 10));
+ }
+ else
+ {
+ int tile;
+ int bank = yunsung8_videobank & 1;
+
+ if (offset < 0x1000) tile = (offset-0x0800); // c800-cfff: Banked Color RAM
+ else tile = (offset-0x1000)/2; // d000-dfff: Banked Tiles RAM
+
+ if (bank) { yunsung8_videoram_0[offset] = data;
+ tilemap_mark_tile_dirty(tilemap_0, tile); }
+ else { yunsung8_videoram_1[offset] = data;
+ tilemap_mark_tile_dirty(tilemap_1, tile); }
+ }
+}
+
+
+WRITE8_HANDLER( yunsung8_flipscreen_w )
+{
+ tilemap_set_flip(ALL_TILEMAPS, (data & 1) ? (TILEMAP_FLIPX|TILEMAP_FLIPY) : 0);
+}
+
+
+/***************************************************************************
+
+ [ Tiles Format ]
+
+ Offset:
+
+ Video RAM + 0000.b Code (Low Bits)
+ Video RAM + 0001.b Code (High Bits)
+
+ Color RAM + 0000.b Color
+
+
+***************************************************************************/
+
+/* Background */
+
+#define DIM_NX_0 (0x40)
+#define DIM_NY_0 (0x20)
+
+static TILE_GET_INFO( get_tile_info_0 )
+{
+ int code = yunsung8_videoram_0[0x1000+tile_index * 2 + 0] + yunsung8_videoram_0[0x1000+tile_index * 2 + 1] * 256;
+ int color = yunsung8_videoram_0[0x0800+ tile_index] & 0x07;
+ SET_TILE_INFO(
+ 0,
+ code,
+ color,
+ 0);
+}
+
+/* Text Plane */
+
+#define DIM_NX_1 (0x40)
+#define DIM_NY_1 (0x20)
+
+static TILE_GET_INFO( get_tile_info_1 )
+{
+ int code = yunsung8_videoram_1[0x1000+ tile_index * 2 + 0] + yunsung8_videoram_1[0x1000+tile_index * 2 + 1] * 256;
+ int color = yunsung8_videoram_1[0x0800+ tile_index] & 0x3f;
+ SET_TILE_INFO(
+ 1,
+ code,
+ color,
+ 0);
+}
+
+
+
+
+/***************************************************************************
+
+
+ Vide Hardware Init
+
+
+***************************************************************************/
+
+VIDEO_START( yunsung8 )
+{
+ tilemap_0 = tilemap_create( get_tile_info_0, tilemap_scan_rows,
+ TILEMAP_TYPE_PEN, 8,8, DIM_NX_0, DIM_NY_0 );
+
+ tilemap_1 = tilemap_create( get_tile_info_1, tilemap_scan_rows,
+ TILEMAP_TYPE_PEN, 8,8, DIM_NX_1, DIM_NY_1 );
+
+ tilemap_set_transparent_pen(tilemap_1,0);
+}
+
+
+
+/***************************************************************************
+
+
+ Screen Drawing
+
+
+***************************************************************************/
+
+VIDEO_UPDATE( yunsung8 )
+{
+ int layers_ctrl = (~yunsung8_layers_ctrl) >> 4;
+
+#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 (msk != 0) layers_ctrl &= msk;
+}
+#endif
+
+ if (layers_ctrl&1) tilemap_draw(bitmap,cliprect, tilemap_0, 0,0);
+ else fillbitmap(bitmap,machine->pens[0],cliprect);
+
+ if (layers_ctrl&2) tilemap_draw(bitmap,cliprect, tilemap_1, 0,0);
+ return 0;
+}