/* Speed Spin video, see driver file for notes */ #include "emu.h" #include "includes/speedspn.h" static TILE_GET_INFO( get_speedspn_tile_info ) { speedspn_state *state = machine.driver_data(); int code = state->m_vidram[tile_index*2+1] | (state->m_vidram[tile_index*2] << 8); int attr = state->m_attram[tile_index^0x400]; SET_TILE_INFO(0,code,attr & 0x3f,(attr & 0x80) ? TILE_FLIPX : 0); } VIDEO_START(speedspn) { speedspn_state *state = machine.driver_data(); state->m_vidram = auto_alloc_array(machine, UINT8, 0x1000 * 2); state->m_tilemap = tilemap_create(machine, get_speedspn_tile_info,tilemap_scan_cols, 8, 8,64,32); } WRITE8_HANDLER( speedspn_vidram_w ) { speedspn_state *state = space->machine().driver_data(); state->m_vidram[offset + state->m_bank_vidram] = data; if (state->m_bank_vidram == 0) tilemap_mark_tile_dirty(state->m_tilemap,offset/2); } WRITE8_HANDLER( speedspn_attram_w ) { speedspn_state *state = space->machine().driver_data(); state->m_attram[offset] = data; tilemap_mark_tile_dirty(state->m_tilemap,offset^0x400); } READ8_HANDLER( speedspn_vidram_r ) { speedspn_state *state = space->machine().driver_data(); return state->m_vidram[offset + state->m_bank_vidram]; } WRITE8_HANDLER(speedspn_banked_vidram_change) { speedspn_state *state = space->machine().driver_data(); // logerror("VidRam Bank: %04x\n", data); state->m_bank_vidram = data & 1; state->m_bank_vidram *= 0x1000; } WRITE8_HANDLER(speedspn_global_display_w) { speedspn_state *state = space->machine().driver_data(); // logerror("Global display: %u\n", data); state->m_display_disable = data & 1; } static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) { speedspn_state *state = machine.driver_data(); const gfx_element *gfx = machine.gfx[1]; UINT8 *source = state->m_vidram+ 0x1000; UINT8 *finish = source + 0x1000; while( source> 5) * 0x100; color = attr & 0x0f; drawgfx_transpen(bitmap,cliprect,gfx, tileno, color, 0,0, xpos,ypos,15); source +=4; } } SCREEN_UPDATE(speedspn) { speedspn_state *state = screen->machine().driver_data(); if (state->m_display_disable) { bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); return 0; } #if 0 { FILE* f; f = fopen("vidram.bin","wb"); fwrite(state->m_vidram, 1, 0x1000 * 2, f); fclose(f); } #endif tilemap_set_scrollx(state->m_tilemap,0, 0x100); // verify tilemap_draw(bitmap,cliprect,state->m_tilemap,0,0); draw_sprites(screen->machine(), bitmap,cliprect); return 0; }