/****************************************************************************** Quiz DNA no Hanran (c) 1992 Face Quiz Gakuen Paradise (c) 1991 NMK Quiz Gekiretsu Scramble (Gakuen Paradise 2) (c) 1993 Face Video hardware driver by Uki ******************************************************************************/ #include "emu.h" #include "includes/quizdna.h" static TILE_GET_INFO( get_bg_tile_info ) { quizdna_state *state = machine.driver_data(); int code = state->m_bg_ram[tile_index*2] + state->m_bg_ram[tile_index*2+1]*0x100 ; int col = state->m_bg_ram[tile_index*2+0x1000] & 0x7f; if (code>0x7fff) code &= 0x83ff; SET_TILE_INFO(1, code, col, 0); } static TILE_GET_INFO( get_fg_tile_info ) { quizdna_state *state = machine.driver_data(); int code,col,x,y; UINT8 *FG = machine.region("user1")->base(); x = tile_index & 0x1f; y = FG[(tile_index >> 5) & 0x1f] & 0x3f; code = y & 1; y >>= 1; col = state->m_fg_ram[x*2 + y*0x40 + 1]; code += (state->m_fg_ram[x*2 + y*0x40] + (col & 0x1f) * 0x100) * 2; col >>= 5; col = (col & 3) | ((col & 4) << 1); SET_TILE_INFO(0, code, col, 0); } VIDEO_START( quizdna ) { quizdna_state *state = machine.driver_data(); state->m_flipscreen = -1; state->m_video_enable = 0; state->m_bg_xscroll[0] = 0; state->m_bg_xscroll[1] = 0; state->m_bg_ram = auto_alloc_array(machine, UINT8, 0x2000); state->m_fg_ram = auto_alloc_array(machine, UINT8, 0x1000); state->m_bg_tilemap = tilemap_create( machine, get_bg_tile_info,tilemap_scan_rows,8,8,64,32 ); state->m_fg_tilemap = tilemap_create( machine, get_fg_tile_info,tilemap_scan_rows,16,8,32,32 ); tilemap_set_transparent_pen( state->m_fg_tilemap,0 ); } WRITE8_HANDLER( quizdna_bg_ram_w ) { quizdna_state *state = space->machine().driver_data(); UINT8 *RAM = space->machine().region("maincpu")->base(); state->m_bg_ram[offset] = data; RAM[0x12000+offset] = data; tilemap_mark_tile_dirty(state->m_bg_tilemap, (offset & 0xfff) / 2 ); } WRITE8_HANDLER( quizdna_fg_ram_w ) { quizdna_state *state = space->machine().driver_data(); int i; int offs = offset & 0xfff; UINT8 *RAM = space->machine().region("maincpu")->base(); RAM[0x10000+offs] = data; RAM[0x11000+offs] = data; /* mirror */ state->m_fg_ram[offs] = data; for (i=0; i<32; i++) tilemap_mark_tile_dirty(state->m_fg_tilemap, ((offs/2) & 0x1f) + i*0x20 ); } WRITE8_HANDLER( quizdna_bg_yscroll_w ) { quizdna_state *state = space->machine().driver_data(); tilemap_set_scrolldy( state->m_bg_tilemap, 255-data, 255-data+1 ); } WRITE8_HANDLER( quizdna_bg_xscroll_w ) { quizdna_state *state = space->machine().driver_data(); int x; state->m_bg_xscroll[offset] = data; x = ~(state->m_bg_xscroll[0] + state->m_bg_xscroll[1]*0x100) & 0x1ff; tilemap_set_scrolldx( state->m_bg_tilemap, x+64, x-64+10 ); } WRITE8_HANDLER( quizdna_screen_ctrl_w ) { quizdna_state *state = space->machine().driver_data(); int tmp = (data & 0x10) >> 4; state->m_video_enable = data & 0x20; coin_counter_w(space->machine(), 0, data & 1); if (state->m_flipscreen == tmp) return; state->m_flipscreen = tmp; flip_screen_set(space->machine(), tmp); tilemap_set_scrolldx( state->m_fg_tilemap, 64, -64 +16); } WRITE8_HANDLER( paletteram_xBGR_RRRR_GGGG_BBBB_w ) { int r,g,b,d0,d1; int offs = offset & ~1; space->machine().generic.paletteram.u8[offset] = data; d0 = space->machine().generic.paletteram.u8[offs]; d1 = space->machine().generic.paletteram.u8[offs+1]; r = ((d1 << 1) & 0x1e) | ((d1 >> 4) & 1); g = ((d0 >> 3) & 0x1e) | ((d1 >> 5) & 1); b = ((d0 << 1) & 0x1e) | ((d1 >> 6) & 1); palette_set_color_rgb(space->machine(),offs/2,pal5bit(r),pal5bit(g),pal5bit(b)); } static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) { quizdna_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; int offs; for (offs = 0; offsm_spriteram_size; offs+=8) { int i; int x = spriteram[offs + 3]*0x100 + spriteram[offs + 2] + 64 - 8; int y = (spriteram[offs + 1] & 1)*0x100 + spriteram[offs + 0]; int code = (spriteram[offs + 5] * 0x100 + spriteram[offs + 4]) & 0x3fff; int col = spriteram[offs + 6]; int fx = col & 0x80; int fy = col & 0x40; int ysize = (spriteram[offs + 1] & 0xc0) >> 6; int dy = 0x10; col &= 0x1f; if (state->m_flipscreen) { x -= 7; y += 1; } x &= 0x1ff; if (x>0x1f0) x -= 0x200; if (fy) { dy = -0x10; y += 0x10 * ysize; } if (code >= 0x2100) code &= 0x20ff; for (i=0; imachine().driver_data(); if (state->m_video_enable) { tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); draw_sprites(screen->machine(), bitmap, cliprect); tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); } else bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); return 0; }