trunk/src/mame/video/taitoair.c
| r21022 | r21023 | |
| 69 | 69 | Screen refresh |
| 70 | 70 | ***************************************************************************/ |
| 71 | 71 | |
| 72 | | static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority ) |
| 72 | void taitoair_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect, int priority ) |
| 73 | 73 | { |
| 74 | 74 | /* Y chain size is 16/32?/64/64? pixels. X chain size |
| 75 | 75 | is always 64 pixels. */ |
| 76 | 76 | |
| 77 | | taitoair_state *state = machine.driver_data<taitoair_state>(); |
| 78 | | address_space &space = machine.driver_data()->generic_space(); |
| 77 | address_space &space = machine().driver_data()->generic_space(); |
| 79 | 78 | static const int size[] = { 1, 2, 4, 4 }; |
| 80 | 79 | int x0, y0, x, y, dx, dy, ex, ey, zx, zy; |
| 81 | 80 | int ysize; |
| r21022 | r21023 | |
| 90 | 89 | if (offs < 0x01b0 && priority == 0) continue; |
| 91 | 90 | if (offs >= 0x01b0 && priority == 1) continue; |
| 92 | 91 | |
| 93 | | x0 = tc0080vco_sprram_r(state->m_tc0080vco, space, offs + 1, 0xffff) & 0x3ff; |
| 94 | | y0 = tc0080vco_sprram_r(state->m_tc0080vco, space, offs + 0, 0xffff) & 0x3ff; |
| 95 | | zoomx = (tc0080vco_sprram_r(state->m_tc0080vco, space, offs + 2, 0xffff) & 0x7f00) >> 8; |
| 96 | | zoomy = (tc0080vco_sprram_r(state->m_tc0080vco, space, offs + 2, 0xffff) & 0x007f); |
| 97 | | tile_offs = (tc0080vco_sprram_r(state->m_tc0080vco, space, offs + 3, 0xffff) & 0x1fff) << 2; |
| 98 | | ysize = size[(tc0080vco_sprram_r(state->m_tc0080vco, space, offs, 0xffff) & 0x0c00) >> 10]; |
| 92 | x0 = tc0080vco_sprram_r(m_tc0080vco, space, offs + 1, 0xffff) & 0x3ff; |
| 93 | y0 = tc0080vco_sprram_r(m_tc0080vco, space, offs + 0, 0xffff) & 0x3ff; |
| 94 | zoomx = (tc0080vco_sprram_r(m_tc0080vco, space, offs + 2, 0xffff) & 0x7f00) >> 8; |
| 95 | zoomy = (tc0080vco_sprram_r(m_tc0080vco, space, offs + 2, 0xffff) & 0x007f); |
| 96 | tile_offs = (tc0080vco_sprram_r(m_tc0080vco, space, offs + 3, 0xffff) & 0x1fff) << 2; |
| 97 | ysize = size[(tc0080vco_sprram_r(m_tc0080vco, space, offs, 0xffff) & 0x0c00) >> 10]; |
| 99 | 98 | |
| 100 | 99 | if (tile_offs) |
| 101 | 100 | { |
| r21022 | r21023 | |
| 131 | 130 | if (x0 >= 0x200) x0 -= 0x400; |
| 132 | 131 | if (y0 >= 0x200) y0 -= 0x400; |
| 133 | 132 | |
| 134 | | if (tc0080vco_flipscreen_r(state->m_tc0080vco)) |
| 133 | if (tc0080vco_flipscreen_r(m_tc0080vco)) |
| 135 | 134 | { |
| 136 | 135 | x0 = 497 - x0; |
| 137 | 136 | y0 = 498 - y0; |
| r21022 | r21023 | |
| 154 | 153 | { |
| 155 | 154 | int tile, color, flipx, flipy; |
| 156 | 155 | |
| 157 | | tile = tc0080vco_cram_0_r(state->m_tc0080vco, space, tile_offs, 0xffff) & 0x7fff; |
| 158 | | color = tc0080vco_cram_1_r(state->m_tc0080vco, space, tile_offs, 0xffff) & 0x001f; |
| 159 | | flipx = tc0080vco_cram_1_r(state->m_tc0080vco, space, tile_offs, 0xffff) & 0x0040; |
| 160 | | flipy = tc0080vco_cram_1_r(state->m_tc0080vco, space, tile_offs, 0xffff) & 0x0080; |
| 156 | tile = tc0080vco_cram_0_r(m_tc0080vco, space, tile_offs, 0xffff) & 0x7fff; |
| 157 | color = tc0080vco_cram_1_r(m_tc0080vco, space, tile_offs, 0xffff) & 0x001f; |
| 158 | flipx = tc0080vco_cram_1_r(m_tc0080vco, space, tile_offs, 0xffff) & 0x0040; |
| 159 | flipy = tc0080vco_cram_1_r(m_tc0080vco, space, tile_offs, 0xffff) & 0x0080; |
| 161 | 160 | |
| 162 | | if (tc0080vco_flipscreen_r(state->m_tc0080vco)) |
| 161 | if (tc0080vco_flipscreen_r(m_tc0080vco)) |
| 163 | 162 | { |
| 164 | 163 | flipx ^= 0x0040; |
| 165 | 164 | flipy ^= 0x0080; |
| 166 | 165 | } |
| 167 | 166 | |
| 168 | 167 | drawgfxzoom_transpen( bitmap, cliprect, |
| 169 | | machine.gfx[0], |
| 168 | machine().gfx[0], |
| 170 | 169 | tile, |
| 171 | 170 | color, |
| 172 | 171 | flipx, flipy, |
| r21022 | r21023 | |
| 183 | 182 | } |
| 184 | 183 | } |
| 185 | 184 | |
| 186 | | static void fill_slope( bitmap_ind16 &bitmap, const rectangle &cliprect, int color, INT32 x1, INT32 x2, INT32 sl1, INT32 sl2, INT32 y1, INT32 y2, INT32 *nx1, INT32 *nx2 ) |
| 185 | void taitoair_state::fill_slope( bitmap_ind16 &bitmap, const rectangle &cliprect, int color, INT32 x1, INT32 x2, INT32 sl1, INT32 sl2, INT32 y1, INT32 y2, INT32 *nx1, INT32 *nx2 ) |
| 187 | 186 | { |
| 188 | 187 | if (y1 > cliprect.max_y) |
| 189 | 188 | return; |
| r21022 | r21023 | |
| 258 | 257 | *nx2 = x2; |
| 259 | 258 | } |
| 260 | 259 | |
| 261 | | static void fill_poly( bitmap_ind16 &bitmap, const rectangle &cliprect, const struct taitoair_poly *q ) |
| 260 | void taitoair_state::fill_poly( bitmap_ind16 &bitmap, const rectangle &cliprect, const struct taitoair_poly *q ) |
| 262 | 261 | { |
| 263 | 262 | INT32 sl1, sl2, cury, limy, x1, x2; |
| 264 | 263 | int pmin, pmax, i, ps1, ps2; |
| r21022 | r21023 | |
| 441 | 440 | } |
| 442 | 441 | |
| 443 | 442 | |
| 444 | | void multVecMtx(const INT16* vec4, const float* m, float* result) |
| 443 | void taitoair_state::multVecMtx(const INT16* vec4, const float* m, float* result) |
| 445 | 444 | { |
| 446 | 445 | #define M(row,col) m[col*4+row] |
| 447 | 446 | result[0] = vec4[0]*M(0,0) + vec4[1]*M(1,0) + vec4[2]*M(2,0) + vec4[3]*M(3,0); |
| r21022 | r21023 | |
| 455 | 454 | #undef M |
| 456 | 455 | } |
| 457 | 456 | |
| 458 | | int projectEyeCoordToScreen(float* projectionMatrix, |
| 459 | | const int Res, |
| 460 | | INT16* eyePoint3d, |
| 461 | | int type) |
| 457 | int taitoair_state::projectEyeCoordToScreen(float* projectionMatrix,const int Res,INT16* eyePoint3d,int type) |
| 462 | 458 | { |
| 463 | 459 | /* Return (-1, -1) if the eye point is behind camera */ |
| 464 | 460 | int res = -10000; |
| r21022 | r21023 | |
| 483 | 479 | return res; |
| 484 | 480 | } |
| 485 | 481 | |
| 486 | | void airInfernoFrustum(const INT16 leftExtent, const INT16 bottomExtent, float* m) |
| 482 | void taitoair_state::airInfernoFrustum(const INT16 leftExtent, const INT16 bottomExtent, float* m) |
| 487 | 483 | { |
| 488 | 484 | /* Hard-coded near and far clipping planes :( */ |
| 489 | 485 | float nearZ = 1.0f; |
| r21022 | r21023 | |
| 598 | 594 | |
| 599 | 595 | tc0080vco_tilemap_draw(m_tc0080vco, bitmap, cliprect, 0, 0, 0); |
| 600 | 596 | |
| 601 | | draw_sprites(machine(), bitmap, cliprect, 0); |
| 597 | draw_sprites(bitmap, cliprect, 0); |
| 602 | 598 | |
| 603 | 599 | copybitmap_trans(bitmap, *m_framebuffer[1], 0, 0, 0, 0, cliprect, 0); |
| 604 | 600 | |
| 605 | 601 | tc0080vco_tilemap_draw(m_tc0080vco, bitmap, cliprect, 1, 0, 0); |
| 606 | 602 | |
| 607 | | draw_sprites(machine(), bitmap, cliprect, 1); |
| 603 | draw_sprites(bitmap, cliprect, 1); |
| 608 | 604 | |
| 609 | 605 | tc0080vco_tilemap_draw(m_tc0080vco, bitmap, cliprect, 2, 0, 0); |
| 610 | 606 | |
trunk/src/mame/video/tceptor.c
| r21022 | r21023 | |
| 87 | 87 | |
| 88 | 88 | /*******************************************************************/ |
| 89 | 89 | |
| 90 | | INLINE int get_tile_addr(int tile_index) |
| 90 | inline int tceptor_state::get_tile_addr(int tile_index) |
| 91 | 91 | { |
| 92 | 92 | int x = tile_index / 28; |
| 93 | 93 | int y = tile_index % 28; |
| r21022 | r21023 | |
| 224 | 224 | |
| 225 | 225 | /*******************************************************************/ |
| 226 | 226 | |
| 227 | | static void decode_bg(running_machine &machine, const char * region) |
| 227 | void tceptor_state::decode_bg(const char * region) |
| 228 | 228 | { |
| 229 | | tceptor_state *state = machine.driver_data<tceptor_state>(); |
| 230 | 229 | static const gfx_layout bg_layout = |
| 231 | 230 | { |
| 232 | 231 | 8, 8, |
| r21022 | r21023 | |
| 238 | 237 | 128 |
| 239 | 238 | }; |
| 240 | 239 | |
| 241 | | int gfx_index = state->m_bg; |
| 242 | | UINT8 *src = machine.root_device().memregion(region)->base() + 0x8000; |
| 240 | int gfx_index = m_bg; |
| 241 | UINT8 *src = machine().root_device().memregion(region)->base() + 0x8000; |
| 243 | 242 | UINT8 *buffer; |
| 244 | 243 | int len = 0x8000; |
| 245 | 244 | int i; |
| 246 | 245 | |
| 247 | | buffer = auto_alloc_array(machine, UINT8, len); |
| 246 | buffer = auto_alloc_array(machine(), UINT8, len); |
| 248 | 247 | |
| 249 | 248 | /* expand rom tc2-19.10d */ |
| 250 | 249 | for (i = 0; i < len / 2; i++) |
| r21022 | r21023 | |
| 254 | 253 | } |
| 255 | 254 | |
| 256 | 255 | memcpy(src, buffer, len); |
| 257 | | auto_free(machine, buffer); |
| 256 | auto_free(machine(), buffer); |
| 258 | 257 | |
| 259 | 258 | /* decode the graphics */ |
| 260 | | machine.gfx[gfx_index] = auto_alloc(machine, gfx_element(machine, bg_layout, machine.root_device().memregion(region)->base(), 64, 2048)); |
| 259 | machine().gfx[gfx_index] = auto_alloc(machine(), gfx_element(machine(), bg_layout, machine().root_device().memregion(region)->base(), 64, 2048)); |
| 261 | 260 | } |
| 262 | 261 | |
| 263 | | static void decode_sprite(running_machine &machine, int gfx_index, const gfx_layout *layout, const void *data) |
| 262 | void tceptor_state::decode_sprite(int gfx_index, const gfx_layout *layout, const void *data) |
| 264 | 263 | { |
| 265 | 264 | /* decode the graphics */ |
| 266 | | machine.gfx[gfx_index] = auto_alloc(machine, gfx_element(machine, *layout, (const UINT8 *)data, 64, 1024)); |
| 265 | machine().gfx[gfx_index] = auto_alloc(machine(), gfx_element(machine(), *layout, (const UINT8 *)data, 64, 1024)); |
| 267 | 266 | } |
| 268 | 267 | |
| 269 | 268 | // fix sprite order |
| 270 | | static void decode_sprite16(running_machine &machine, const char * region) |
| 269 | void tceptor_state::decode_sprite16(const char * region) |
| 271 | 270 | { |
| 272 | | tceptor_state *state = machine.driver_data<tceptor_state>(); |
| 273 | 271 | static const gfx_layout spr16_layout = |
| 274 | 272 | { |
| 275 | 273 | 16, 16, |
| r21022 | r21023 | |
| 287 | 285 | 2*16*16 |
| 288 | 286 | }; |
| 289 | 287 | |
| 290 | | UINT8 *src = machine.root_device().memregion(region)->base(); |
| 291 | | int len = machine.root_device().memregion(region)->bytes(); |
| 288 | UINT8 *src = machine().root_device().memregion(region)->base(); |
| 289 | int len = machine().root_device().memregion(region)->bytes(); |
| 292 | 290 | UINT8 *dst; |
| 293 | 291 | int i, y; |
| 294 | 292 | |
| 295 | | dst = auto_alloc_array(machine, UINT8, len); |
| 293 | dst = auto_alloc_array(machine(), UINT8, len); |
| 296 | 294 | |
| 297 | 295 | for (i = 0; i < len / (4*4*16); i++) |
| 298 | 296 | for (y = 0; y < 16; y++) |
| r21022 | r21023 | |
| 311 | 309 | 4); |
| 312 | 310 | } |
| 313 | 311 | |
| 314 | | decode_sprite(machine, state->m_sprite16, &spr16_layout, dst); |
| 312 | decode_sprite(m_sprite16, &spr16_layout, dst); |
| 315 | 313 | } |
| 316 | 314 | |
| 317 | 315 | // fix sprite order |
| 318 | | static void decode_sprite32(running_machine &machine, const char * region) |
| 316 | void tceptor_state::decode_sprite32(const char * region) |
| 319 | 317 | { |
| 320 | | tceptor_state *state = machine.driver_data<tceptor_state>(); |
| 321 | 318 | static const gfx_layout spr32_layout = |
| 322 | 319 | { |
| 323 | 320 | 32, 32, |
| r21022 | r21023 | |
| 339 | 336 | 2*32*32 |
| 340 | 337 | }; |
| 341 | 338 | |
| 342 | | UINT8 *src = machine.root_device().memregion(region)->base(); |
| 343 | | int len = machine.root_device().memregion(region)->bytes(); |
| 339 | UINT8 *src = machine().root_device().memregion(region)->base(); |
| 340 | int len = machine().root_device().memregion(region)->bytes(); |
| 344 | 341 | int total = spr32_layout.total; |
| 345 | 342 | int size = spr32_layout.charincrement / 8; |
| 346 | 343 | UINT8 *dst; |
| 347 | 344 | int i; |
| 348 | 345 | |
| 349 | | dst = auto_alloc_array(machine, UINT8, len); |
| 346 | dst = auto_alloc_array(machine(), UINT8, len); |
| 350 | 347 | |
| 351 | 348 | memset(dst, 0, len); |
| 352 | 349 | |
| r21022 | r21023 | |
| 361 | 358 | memcpy(&dst[size * (i + total)], &src[size * (code + total)], size); |
| 362 | 359 | } |
| 363 | 360 | |
| 364 | | decode_sprite(machine, state->m_sprite32, &spr32_layout, dst); |
| 361 | decode_sprite(m_sprite32, &spr32_layout, dst); |
| 365 | 362 | } |
| 366 | 363 | |
| 367 | 364 | void tceptor_state::video_start() |
| r21022 | r21023 | |
| 377 | 374 | assert(gfx_index + 4 <= MAX_GFX_ELEMENTS); |
| 378 | 375 | |
| 379 | 376 | m_bg = gfx_index++; |
| 380 | | decode_bg(machine(), "gfx2"); |
| 377 | decode_bg("gfx2"); |
| 381 | 378 | |
| 382 | 379 | m_sprite16 = gfx_index++; |
| 383 | | decode_sprite16(machine(), "gfx3"); |
| 380 | decode_sprite16("gfx3"); |
| 384 | 381 | |
| 385 | 382 | m_sprite32 = gfx_index++; |
| 386 | | decode_sprite32(machine(), "gfx4"); |
| 383 | decode_sprite32("gfx4"); |
| 387 | 384 | |
| 388 | 385 | /* allocate temp bitmaps */ |
| 389 | 386 | machine().primary_screen->register_screen_bitmap(m_temp_bitmap); |
| r21022 | r21023 | |
| 430 | 427 | z: zoom y |
| 431 | 428 | */ |
| 432 | 429 | |
| 433 | | static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int sprite_priority) |
| 430 | void tceptor_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, int sprite_priority) |
| 434 | 431 | { |
| 435 | | tceptor_state *state = machine.driver_data<tceptor_state>(); |
| 436 | | UINT16 *mem1 = &state->m_sprite_ram_buffered[0x000/2]; |
| 437 | | UINT16 *mem2 = &state->m_sprite_ram_buffered[0x100/2]; |
| 432 | UINT16 *mem1 = &m_sprite_ram_buffered[0x000/2]; |
| 433 | UINT16 *mem2 = &m_sprite_ram_buffered[0x100/2]; |
| 438 | 434 | int need_mask = 0; |
| 439 | 435 | int i; |
| 440 | 436 | |
| r21022 | r21023 | |
| 456 | 452 | |
| 457 | 453 | if (mem2[0 + i] & 0x2000) |
| 458 | 454 | { |
| 459 | | gfx = state->m_sprite32; |
| 455 | gfx = m_sprite32; |
| 460 | 456 | code = mem1[0 + i] & 0x3ff; |
| 461 | 457 | |
| 462 | 458 | } |
| 463 | 459 | else |
| 464 | 460 | { |
| 465 | | gfx = state->m_sprite16; |
| 461 | gfx = m_sprite16; |
| 466 | 462 | code = mem1[0 + i] & 0x1ff; |
| 467 | 463 | scaley *= 2; |
| 468 | 464 | } |
| 469 | 465 | |
| 470 | | if (state->m_is_mask_spr[color]) |
| 466 | if (m_is_mask_spr[color]) |
| 471 | 467 | { |
| 472 | 468 | if (!need_mask) |
| 473 | 469 | // backup previous bitmap |
| 474 | | copybitmap(state->m_temp_bitmap, bitmap, 0, 0, 0, 0, cliprect); |
| 470 | copybitmap(m_temp_bitmap, bitmap, 0, 0, 0, 0, cliprect); |
| 475 | 471 | |
| 476 | 472 | need_mask = 1; |
| 477 | 473 | } |
| r21022 | r21023 | |
| 485 | 481 | |
| 486 | 482 | drawgfxzoom_transmask(bitmap, |
| 487 | 483 | cliprect, |
| 488 | | machine.gfx[gfx], |
| 484 | machine().gfx[gfx], |
| 489 | 485 | code, |
| 490 | 486 | color, |
| 491 | 487 | flipx, flipy, |
| 492 | 488 | x, y, |
| 493 | 489 | scalex, |
| 494 | 490 | scaley, |
| 495 | | colortable_get_transpen_mask(machine.colortable, machine.gfx[gfx], color, SPR_TRANS_COLOR)); |
| 491 | colortable_get_transpen_mask(machine().colortable, machine().gfx[gfx], color, SPR_TRANS_COLOR)); |
| 496 | 492 | } |
| 497 | 493 | } |
| 498 | 494 | |
| r21022 | r21023 | |
| 503 | 499 | |
| 504 | 500 | for (x = cliprect.min_x; x <= cliprect.max_x; x++) |
| 505 | 501 | for (y = cliprect.min_y; y <= cliprect.max_y; y++) |
| 506 | | if (colortable_entry_get_value(machine.colortable, bitmap.pix16(y, x)) == SPR_MASK_COLOR) |
| 502 | if (colortable_entry_get_value(machine().colortable, bitmap.pix16(y, x)) == SPR_MASK_COLOR) |
| 507 | 503 | // restore pixel |
| 508 | | bitmap.pix16(y, x) = state->m_temp_bitmap.pix16(y, x); |
| 504 | bitmap.pix16(y, x) = m_temp_bitmap.pix16(y, x); |
| 509 | 505 | } |
| 510 | 506 | } |
| 511 | 507 | |
| r21022 | r21023 | |
| 534 | 530 | { |
| 535 | 531 | m_c45_road->draw(bitmap, cliprect, pri * 2); |
| 536 | 532 | m_c45_road->draw(bitmap, cliprect, pri * 2 + 1); |
| 537 | | draw_sprites(machine(), bitmap, cliprect, pri); |
| 533 | draw_sprites(bitmap, cliprect, pri); |
| 538 | 534 | } |
| 539 | 535 | |
| 540 | 536 | m_tx_tilemap->draw(bitmap, cliprect, 0, 0); |
trunk/src/mame/video/taito_h.c
| r21022 | r21023 | |
| 70 | 70 | Screen refresh |
| 71 | 71 | ***************************************************************************/ |
| 72 | 72 | |
| 73 | | static void syvalion_draw_sprites( running_machine &machine,bitmap_ind16 &bitmap, const rectangle &cliprect ) |
| 73 | void taitoh_state::syvalion_draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect ) |
| 74 | 74 | { |
| 75 | 75 | /* Y chain size is 16/32?/64/64? pixels. X chain size |
| 76 | 76 | is always 64 pixels. */ |
| 77 | 77 | |
| 78 | | taitoh_state *state = machine.driver_data<taitoh_state>(); |
| 79 | | address_space &space = machine.driver_data()->generic_space(); |
| 78 | address_space &space = machine().driver_data()->generic_space(); |
| 80 | 79 | static const int size[] = { 1, 2, 4, 4 }; |
| 81 | 80 | int x0, y0, x, y, dx, ex, zx; |
| 82 | 81 | int ysize; |
| r21022 | r21023 | |
| 87 | 86 | |
| 88 | 87 | for (offs = 0x03f8 / 2; offs >= 0; offs -= 0x008 / 2) |
| 89 | 88 | { |
| 90 | | x0 = tc0080vco_sprram_r(state->m_tc0080vco, space, offs + 1, 0xffff) & 0x3ff; |
| 91 | | y0 = tc0080vco_sprram_r(state->m_tc0080vco, space, offs + 0, 0xffff) & 0x3ff; |
| 92 | | zoomx = (tc0080vco_sprram_r(state->m_tc0080vco, space, offs + 2, 0xffff) & 0x7f00) >> 8; |
| 93 | | tile_offs = (tc0080vco_sprram_r(state->m_tc0080vco, space, offs + 3, 0xffff) & 0x1fff) << 2; |
| 94 | | ysize = size[(tc0080vco_sprram_r(state->m_tc0080vco, space, offs, 0xffff) & 0x0c00) >> 10]; |
| 89 | x0 = tc0080vco_sprram_r(m_tc0080vco, space, offs + 1, 0xffff) & 0x3ff; |
| 90 | y0 = tc0080vco_sprram_r(m_tc0080vco, space, offs + 0, 0xffff) & 0x3ff; |
| 91 | zoomx = (tc0080vco_sprram_r(m_tc0080vco, space, offs + 2, 0xffff) & 0x7f00) >> 8; |
| 92 | tile_offs = (tc0080vco_sprram_r(m_tc0080vco, space, offs + 3, 0xffff) & 0x1fff) << 2; |
| 93 | ysize = size[(tc0080vco_sprram_r(m_tc0080vco, space, offs, 0xffff) & 0x0c00) >> 10]; |
| 95 | 94 | |
| 96 | 95 | if (tile_offs) |
| 97 | 96 | { |
| r21022 | r21023 | |
| 113 | 112 | if (x0 >= 0x200) x0 -= 0x400; |
| 114 | 113 | if (y0 >= 0x200) y0 -= 0x400; |
| 115 | 114 | |
| 116 | | if (tc0080vco_flipscreen_r(state->m_tc0080vco)) |
| 115 | if (tc0080vco_flipscreen_r(m_tc0080vco)) |
| 117 | 116 | { |
| 118 | 117 | x0 = 497 - x0; |
| 119 | 118 | y0 = 498 - y0; |
| r21022 | r21023 | |
| 135 | 134 | { |
| 136 | 135 | int tile, color, flipx, flipy; |
| 137 | 136 | |
| 138 | | tile = tc0080vco_cram_0_r(state->m_tc0080vco, space, tile_offs, 0xffff) & 0x7fff; |
| 139 | | color = tc0080vco_cram_1_r(state->m_tc0080vco, space, tile_offs, 0xffff) & 0x001f; |
| 140 | | flipx = tc0080vco_cram_1_r(state->m_tc0080vco, space, tile_offs, 0xffff) & 0x0040; |
| 141 | | flipy = tc0080vco_cram_1_r(state->m_tc0080vco, space, tile_offs, 0xffff) & 0x0080; |
| 137 | tile = tc0080vco_cram_0_r(m_tc0080vco, space, tile_offs, 0xffff) & 0x7fff; |
| 138 | color = tc0080vco_cram_1_r(m_tc0080vco, space, tile_offs, 0xffff) & 0x001f; |
| 139 | flipx = tc0080vco_cram_1_r(m_tc0080vco, space, tile_offs, 0xffff) & 0x0040; |
| 140 | flipy = tc0080vco_cram_1_r(m_tc0080vco, space, tile_offs, 0xffff) & 0x0080; |
| 142 | 141 | |
| 143 | | if (tc0080vco_flipscreen_r(state->m_tc0080vco)) |
| 142 | if (tc0080vco_flipscreen_r(m_tc0080vco)) |
| 144 | 143 | { |
| 145 | 144 | flipx ^= 0x0040; |
| 146 | 145 | flipy ^= 0x0080; |
| 147 | 146 | } |
| 148 | 147 | |
| 149 | 148 | drawgfxzoom_transpen( bitmap, cliprect, |
| 150 | | machine.gfx[0], |
| 149 | machine().gfx[0], |
| 151 | 150 | tile, |
| 152 | 151 | color, |
| 153 | 152 | flipx, flipy, |
| r21022 | r21023 | |
| 164 | 163 | } |
| 165 | 164 | } |
| 166 | 165 | |
| 167 | | static void recordbr_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority ) |
| 166 | void taitoh_state::recordbr_draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect, int priority ) |
| 168 | 167 | { |
| 169 | 168 | /* Y chain size is 16/32?/64/64? pixels. X chain size |
| 170 | 169 | is always 64 pixels. */ |
| 171 | 170 | |
| 172 | | taitoh_state *state = machine.driver_data<taitoh_state>(); |
| 173 | | address_space &space = machine.driver_data()->generic_space(); |
| 171 | address_space &space = machine().driver_data()->generic_space(); |
| 174 | 172 | static const int size[] = { 1, 2, 4, 4 }; |
| 175 | 173 | int x0, y0, x, y, dx, dy, ex, ey, zx, zy; |
| 176 | 174 | int ysize; |
| r21022 | r21023 | |
| 184 | 182 | if (offs < 0x01b0 && priority == 0) continue; |
| 185 | 183 | if (offs >= 0x01b0 && priority == 1) continue; |
| 186 | 184 | |
| 187 | | x0 = tc0080vco_sprram_r(state->m_tc0080vco, space, offs + 1, 0xffff) & 0x3ff; |
| 188 | | y0 = tc0080vco_sprram_r(state->m_tc0080vco, space, offs + 0, 0xffff) & 0x3ff; |
| 189 | | zoomx = (tc0080vco_sprram_r(state->m_tc0080vco, space, offs + 2, 0xffff) & 0x7f00) >> 8; |
| 190 | | zoomy = (tc0080vco_sprram_r(state->m_tc0080vco, space, offs + 2, 0xffff) & 0x007f); |
| 191 | | tile_offs = (tc0080vco_sprram_r(state->m_tc0080vco, space, offs + 3, 0xffff) & 0x1fff) << 2; |
| 192 | | ysize = size[(tc0080vco_sprram_r(state->m_tc0080vco, space, offs, 0xffff) & 0x0c00) >> 10]; |
| 185 | x0 = tc0080vco_sprram_r(m_tc0080vco, space, offs + 1, 0xffff) & 0x3ff; |
| 186 | y0 = tc0080vco_sprram_r(m_tc0080vco, space, offs + 0, 0xffff) & 0x3ff; |
| 187 | zoomx = (tc0080vco_sprram_r(m_tc0080vco, space, offs + 2, 0xffff) & 0x7f00) >> 8; |
| 188 | zoomy = (tc0080vco_sprram_r(m_tc0080vco, space, offs + 2, 0xffff) & 0x007f); |
| 189 | tile_offs = (tc0080vco_sprram_r(m_tc0080vco, space, offs + 3, 0xffff) & 0x1fff) << 2; |
| 190 | ysize = size[(tc0080vco_sprram_r(m_tc0080vco, space, offs, 0xffff) & 0x0c00) >> 10]; |
| 193 | 191 | |
| 194 | 192 | if (tile_offs) |
| 195 | 193 | { |
| r21022 | r21023 | |
| 225 | 223 | if (x0 >= 0x200) x0 -= 0x400; |
| 226 | 224 | if (y0 >= 0x200) y0 -= 0x400; |
| 227 | 225 | |
| 228 | | if (tc0080vco_flipscreen_r(state->m_tc0080vco)) |
| 226 | if (tc0080vco_flipscreen_r(m_tc0080vco)) |
| 229 | 227 | { |
| 230 | 228 | x0 = 497 - x0; |
| 231 | 229 | y0 = 498 - y0; |
| r21022 | r21023 | |
| 248 | 246 | { |
| 249 | 247 | int tile, color, flipx, flipy; |
| 250 | 248 | |
| 251 | | tile = tc0080vco_cram_0_r(state->m_tc0080vco, space, tile_offs, 0xffff) & 0x7fff; |
| 252 | | color = tc0080vco_cram_1_r(state->m_tc0080vco, space, tile_offs, 0xffff) & 0x001f; |
| 253 | | flipx = tc0080vco_cram_1_r(state->m_tc0080vco, space, tile_offs, 0xffff) & 0x0040; |
| 254 | | flipy = tc0080vco_cram_1_r(state->m_tc0080vco, space, tile_offs, 0xffff) & 0x0080; |
| 249 | tile = tc0080vco_cram_0_r(m_tc0080vco, space, tile_offs, 0xffff) & 0x7fff; |
| 250 | color = tc0080vco_cram_1_r(m_tc0080vco, space, tile_offs, 0xffff) & 0x001f; |
| 251 | flipx = tc0080vco_cram_1_r(m_tc0080vco, space, tile_offs, 0xffff) & 0x0040; |
| 252 | flipy = tc0080vco_cram_1_r(m_tc0080vco, space, tile_offs, 0xffff) & 0x0080; |
| 255 | 253 | |
| 256 | | if (tc0080vco_flipscreen_r(state->m_tc0080vco)) |
| 254 | if (tc0080vco_flipscreen_r(m_tc0080vco)) |
| 257 | 255 | { |
| 258 | 256 | flipx ^= 0x0040; |
| 259 | 257 | flipy ^= 0x0080; |
| 260 | 258 | } |
| 261 | 259 | |
| 262 | 260 | drawgfxzoom_transpen( bitmap, cliprect, |
| 263 | | machine.gfx[0], |
| 261 | machine().gfx[0], |
| 264 | 262 | tile, |
| 265 | 263 | color, |
| 266 | 264 | flipx, flipy, |
| r21022 | r21023 | |
| 277 | 275 | } |
| 278 | 276 | } |
| 279 | 277 | |
| 280 | | static void dleague_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority ) |
| 278 | void taitoh_state::dleague_draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect, int priority ) |
| 281 | 279 | { |
| 282 | 280 | /* Y chain size is 16/32?/64/64? pixels. X chain size |
| 283 | 281 | is always 64 pixels. */ |
| 284 | 282 | |
| 285 | | taitoh_state *state = machine.driver_data<taitoh_state>(); |
| 286 | | address_space &space = machine.driver_data()->generic_space(); |
| 283 | address_space &space = machine().driver_data()->generic_space(); |
| 287 | 284 | static const int size[] = { 1, 2, 4, 4 }; |
| 288 | 285 | int x0, y0, x, y, dx, ex, zx; |
| 289 | 286 | int ysize; |
| r21022 | r21023 | |
| 295 | 292 | |
| 296 | 293 | for (offs = 0x03f8 / 2; offs >= 0; offs -= 0x008 / 2) |
| 297 | 294 | { |
| 298 | | x0 = tc0080vco_sprram_r(state->m_tc0080vco, space, offs + 1, 0xffff) & 0x3ff; |
| 299 | | y0 = tc0080vco_sprram_r(state->m_tc0080vco, space, offs + 0, 0xffff) & 0x3ff; |
| 300 | | zoomx = (tc0080vco_sprram_r(state->m_tc0080vco, space, offs + 2, 0xffff) & 0x7f00) >> 8; |
| 301 | | tile_offs = (tc0080vco_sprram_r(state->m_tc0080vco, space, offs + 3, 0xffff) & 0x1fff) << 2; |
| 302 | | pribit = (tc0080vco_sprram_r(state->m_tc0080vco, space, offs + 0, 0xffff) & 0x1000) >> 12; |
| 303 | | ysize = size[(tc0080vco_sprram_r(state->m_tc0080vco, space, offs, 0xffff) & 0x0c00) >> 10]; |
| 295 | x0 = tc0080vco_sprram_r(m_tc0080vco, space, offs + 1, 0xffff) & 0x3ff; |
| 296 | y0 = tc0080vco_sprram_r(m_tc0080vco, space, offs + 0, 0xffff) & 0x3ff; |
| 297 | zoomx = (tc0080vco_sprram_r(m_tc0080vco, space, offs + 2, 0xffff) & 0x7f00) >> 8; |
| 298 | tile_offs = (tc0080vco_sprram_r(m_tc0080vco, space, offs + 3, 0xffff) & 0x1fff) << 2; |
| 299 | pribit = (tc0080vco_sprram_r(m_tc0080vco, space, offs + 0, 0xffff) & 0x1000) >> 12; |
| 300 | ysize = size[(tc0080vco_sprram_r(m_tc0080vco, space, offs, 0xffff) & 0x0c00) >> 10]; |
| 304 | 301 | |
| 305 | 302 | if (tile_offs) |
| 306 | 303 | { |
| r21022 | r21023 | |
| 320 | 317 | zx = (dx + ex) << 12; |
| 321 | 318 | } |
| 322 | 319 | |
| 323 | | if (tc0080vco_scrram_r(state->m_tc0080vco, space, 0x0002, 0xffff) & 0x8000) |
| 320 | if (tc0080vco_scrram_r(m_tc0080vco, space, 0x0002, 0xffff) & 0x8000) |
| 324 | 321 | pribit = 1; |
| 325 | 322 | |
| 326 | 323 | if (x0 >= 0x200) x0 -= 0x400; |
| 327 | 324 | if (y0 >= 0x200) y0 -= 0x400; |
| 328 | 325 | |
| 329 | | if (tc0080vco_flipscreen_r(state->m_tc0080vco)) |
| 326 | if (tc0080vco_flipscreen_r(m_tc0080vco)) |
| 330 | 327 | { |
| 331 | 328 | x0 = 497 - x0; |
| 332 | 329 | y0 = 498 - y0; |
| r21022 | r21023 | |
| 350 | 347 | { |
| 351 | 348 | int tile, color, flipx, flipy; |
| 352 | 349 | |
| 353 | | tile = tc0080vco_cram_0_r(state->m_tc0080vco, space, tile_offs, 0xffff) & 0x7fff; |
| 354 | | color = tc0080vco_cram_1_r(state->m_tc0080vco, space, tile_offs, 0xffff) & 0x001f; |
| 355 | | flipx = tc0080vco_cram_1_r(state->m_tc0080vco, space, tile_offs, 0xffff) & 0x0040; |
| 356 | | flipy = tc0080vco_cram_1_r(state->m_tc0080vco, space, tile_offs, 0xffff) & 0x0080; |
| 350 | tile = tc0080vco_cram_0_r(m_tc0080vco, space, tile_offs, 0xffff) & 0x7fff; |
| 351 | color = tc0080vco_cram_1_r(m_tc0080vco, space, tile_offs, 0xffff) & 0x001f; |
| 352 | flipx = tc0080vco_cram_1_r(m_tc0080vco, space, tile_offs, 0xffff) & 0x0040; |
| 353 | flipy = tc0080vco_cram_1_r(m_tc0080vco, space, tile_offs, 0xffff) & 0x0080; |
| 357 | 354 | |
| 358 | 355 | |
| 359 | | if (tc0080vco_flipscreen_r(state->m_tc0080vco)) |
| 356 | if (tc0080vco_flipscreen_r(m_tc0080vco)) |
| 360 | 357 | { |
| 361 | 358 | flipx ^= 0x0040; |
| 362 | 359 | flipy ^= 0x0080; |
| 363 | 360 | } |
| 364 | 361 | |
| 365 | 362 | drawgfxzoom_transpen( bitmap, cliprect, |
| 366 | | machine.gfx[0], |
| 363 | machine().gfx[0], |
| 367 | 364 | tile, |
| 368 | 365 | color, |
| 369 | 366 | flipx, flipy, |
| r21022 | r21023 | |
| 383 | 380 | |
| 384 | 381 | |
| 385 | 382 | |
| 386 | | static void taitoh_log_vram(running_machine &machine) |
| 383 | void taitoh_state::taitoh_log_vram() |
| 387 | 384 | { |
| 388 | 385 | #ifdef MAME_DEBUG |
| 389 | 386 | // null function: the necessary pointers are now internal to taitoic.c |
| r21022 | r21023 | |
| 398 | 395 | { |
| 399 | 396 | tc0080vco_tilemap_update(m_tc0080vco); |
| 400 | 397 | |
| 401 | | taitoh_log_vram(machine()); |
| 398 | taitoh_log_vram(); |
| 402 | 399 | |
| 403 | 400 | bitmap.fill(0, cliprect); |
| 404 | 401 | |
| 405 | 402 | tc0080vco_tilemap_draw(m_tc0080vco, bitmap, cliprect, 0, TILEMAP_DRAW_OPAQUE, 0); |
| 406 | 403 | tc0080vco_tilemap_draw(m_tc0080vco, bitmap, cliprect, 1, 0, 0); |
| 407 | | syvalion_draw_sprites(machine(), bitmap,cliprect); |
| 404 | syvalion_draw_sprites(bitmap,cliprect); |
| 408 | 405 | tc0080vco_tilemap_draw(m_tc0080vco, bitmap, cliprect, 2, 0, 0); |
| 409 | 406 | |
| 410 | 407 | return 0; |
| r21022 | r21023 | |
| 415 | 412 | { |
| 416 | 413 | tc0080vco_tilemap_update(m_tc0080vco); |
| 417 | 414 | |
| 418 | | taitoh_log_vram(machine()); |
| 415 | taitoh_log_vram(); |
| 419 | 416 | |
| 420 | 417 | bitmap.fill(0, cliprect); |
| 421 | 418 | |
| r21022 | r21023 | |
| 423 | 420 | if (!machine().input().code_pressed(KEYCODE_A)) |
| 424 | 421 | tc0080vco_tilemap_draw(m_tc0080vco, bitmap, cliprect, 0, TILEMAP_DRAW_OPAQUE, 0); |
| 425 | 422 | if (!machine().input().code_pressed(KEYCODE_S)) |
| 426 | | recordbr_draw_sprites(machine(), bitmap, cliprect, 0); |
| 423 | recordbr_draw_sprites(bitmap, cliprect, 0); |
| 427 | 424 | if (!machine().input().code_pressed(KEYCODE_D)) |
| 428 | 425 | tc0080vco_tilemap_draw(m_tc0080vco, bitmap, cliprect, 1, 0, 0); |
| 429 | 426 | if (!machine().input().code_pressed(KEYCODE_F)) |
| 430 | | recordbr_draw_sprites(machine(), bitmap, cliprect, 1); |
| 427 | recordbr_draw_sprites(bitmap, cliprect, 1); |
| 431 | 428 | #else |
| 432 | 429 | tc0080vco_tilemap_draw(m_tc0080vco, bitmap, cliprect, 0, TILEMAP_DRAW_OPAQUE, 0); |
| 433 | | recordbr_draw_sprites(machine(), bitmap, cliprect, 0); |
| 430 | recordbr_draw_sprites(bitmap, cliprect, 0); |
| 434 | 431 | tc0080vco_tilemap_draw(m_tc0080vco, bitmap, cliprect, 1, 0, 0); |
| 435 | | recordbr_draw_sprites(machine(), bitmap, cliprect, 1); |
| 432 | recordbr_draw_sprites(bitmap, cliprect, 1); |
| 436 | 433 | #endif |
| 437 | 434 | |
| 438 | 435 | tc0080vco_tilemap_draw(m_tc0080vco, bitmap, cliprect, 2, 0, 0); |
| r21022 | r21023 | |
| 444 | 441 | { |
| 445 | 442 | tc0080vco_tilemap_update(m_tc0080vco); |
| 446 | 443 | |
| 447 | | taitoh_log_vram(machine()); |
| 444 | taitoh_log_vram(); |
| 448 | 445 | |
| 449 | 446 | bitmap.fill(0, cliprect); |
| 450 | 447 | |
| r21022 | r21023 | |
| 459 | 456 | dleague_draw_sprites(machine(), bitmap, cliprect, 1); |
| 460 | 457 | #else |
| 461 | 458 | tc0080vco_tilemap_draw(m_tc0080vco, bitmap, cliprect, 0, TILEMAP_DRAW_OPAQUE, 0); |
| 462 | | dleague_draw_sprites (machine(), bitmap, cliprect, 0); |
| 459 | dleague_draw_sprites (bitmap, cliprect, 0); |
| 463 | 460 | tc0080vco_tilemap_draw(m_tc0080vco, bitmap, cliprect, 1, 0, 0); |
| 464 | | dleague_draw_sprites (machine(), bitmap, cliprect, 1); |
| 461 | dleague_draw_sprites (bitmap, cliprect, 1); |
| 465 | 462 | #endif |
| 466 | 463 | |
| 467 | 464 | tc0080vco_tilemap_draw(m_tc0080vco, bitmap, cliprect, 2, 0, 0); |
trunk/src/mame/video/taitosj.c
| r21022 | r21023 | |
| 11 | 11 | #include "includes/taitosj.h" |
| 12 | 12 | |
| 13 | 13 | |
| 14 | | #define GLOBAL_FLIP_X (*state->m_video_mode & 0x01) |
| 15 | | #define GLOBAL_FLIP_Y (*state->m_video_mode & 0x02) |
| 16 | | #define SPRITE_RAM_PAGE_OFFSET ((*state->m_video_mode & 0x04) ? 0x80 : 0x00) |
| 17 | | #define SPRITES_ON (*state->m_video_mode & 0x80) |
| 14 | #define GLOBAL_FLIP_X (*m_video_mode & 0x01) |
| 15 | #define GLOBAL_FLIP_Y (*m_video_mode & 0x02) |
| 16 | #define SPRITE_RAM_PAGE_OFFSET ((*m_video_mode & 0x04) ? 0x80 : 0x00) |
| 17 | #define SPRITES_ON (*m_video_mode & 0x80) |
| 18 | 18 | #define TRANSPARENT_PEN (0x40) |
| 19 | 19 | |
| 20 | 20 | |
| 21 | 21 | |
| 22 | 22 | static const int layer_enable_mask[3] = { 0x10, 0x20, 0x40 }; |
| 23 | 23 | |
| 24 | | typedef void (*copy_layer_func_t)(running_machine &, bitmap_ind16 &, |
| 25 | | const rectangle &, int, int *, rectangle *); |
| 26 | 24 | |
| 27 | | |
| 28 | 25 | /*************************************************************************** |
| 29 | 26 | |
| 30 | 27 | I call the three layers with the conventional names "front", "middle" and |
| r21022 | r21023 | |
| 90 | 87 | |
| 91 | 88 | ***************************************************************************/ |
| 92 | 89 | |
| 93 | | static void set_pens(running_machine &machine) |
| 90 | void taitosj_state::set_pens() |
| 94 | 91 | { |
| 95 | | taitosj_state *state = machine.driver_data<taitosj_state>(); |
| 96 | 92 | static const int resistances[3] = { 1000, 470, 270 }; |
| 97 | 93 | double rweights[3], gweights[3], bweights[3]; |
| 98 | 94 | int i; |
| r21022 | r21023 | |
| 109 | 105 | int r, g, b, val; |
| 110 | 106 | |
| 111 | 107 | /* red component */ |
| 112 | | val = state->m_paletteram[(i << 1) | 0x01]; |
| 108 | val = m_paletteram[(i << 1) | 0x01]; |
| 113 | 109 | bit0 = (~val >> 6) & 0x01; |
| 114 | 110 | bit1 = (~val >> 7) & 0x01; |
| 115 | | val = state->m_paletteram[(i << 1) | 0x00]; |
| 111 | val = m_paletteram[(i << 1) | 0x00]; |
| 116 | 112 | bit2 = (~val >> 0) & 0x01; |
| 117 | 113 | r = combine_3_weights(rweights, bit0, bit1, bit2); |
| 118 | 114 | |
| 119 | 115 | /* green component */ |
| 120 | | val = state->m_paletteram[(i << 1) | 0x01]; |
| 116 | val = m_paletteram[(i << 1) | 0x01]; |
| 121 | 117 | bit0 = (~val >> 3) & 0x01; |
| 122 | 118 | bit1 = (~val >> 4) & 0x01; |
| 123 | 119 | bit2 = (~val >> 5) & 0x01; |
| 124 | 120 | g = combine_3_weights(gweights, bit0, bit1, bit2); |
| 125 | 121 | |
| 126 | 122 | /* blue component */ |
| 127 | | val = state->m_paletteram[(i << 1) | 0x01]; |
| 123 | val = m_paletteram[(i << 1) | 0x01]; |
| 128 | 124 | bit0 = (~val >> 0) & 0x01; |
| 129 | 125 | bit1 = (~val >> 1) & 0x01; |
| 130 | 126 | bit2 = (~val >> 2) & 0x01; |
| 131 | 127 | b = combine_3_weights(bweights, bit0, bit1, bit2); |
| 132 | 128 | |
| 133 | | palette_set_color(machine, i, MAKE_RGB(r, g, b)); |
| 129 | palette_set_color(machine(), i, MAKE_RGB(r, g, b)); |
| 134 | 130 | } |
| 135 | 131 | } |
| 136 | 132 | |
| r21022 | r21023 | |
| 140 | 136 | |
| 141 | 137 | ***************************************************************************/ |
| 142 | 138 | |
| 143 | | static void compute_draw_order(running_machine &machine) |
| 139 | void taitosj_state::compute_draw_order() |
| 144 | 140 | { |
| 145 | | taitosj_state *state = machine.driver_data<taitosj_state>(); |
| 146 | 141 | int i; |
| 147 | | UINT8 *color_prom = state->memregion("proms")->base(); |
| 142 | UINT8 *color_prom = memregion("proms")->base(); |
| 148 | 143 | |
| 149 | 144 | /* do a simple conversion of the PROM into layer priority order. Note that */ |
| 150 | 145 | /* this is a simplification, which assumes the PROM encodes a sensible priority */ |
| r21022 | r21023 | |
| 165 | 160 | |
| 166 | 161 | mask |= (1 << data); /* in next loop, we'll see which of the remaining */ |
| 167 | 162 | /* layers has top priority when this one is transparent */ |
| 168 | | state->m_draw_order[i][j] = data; |
| 163 | m_draw_order[i][j] = data; |
| 169 | 164 | } |
| 170 | 165 | } |
| 171 | 166 | } |
| r21022 | r21023 | |
| 191 | 186 | machine().gfx[2]->set_source(m_characterram + 0x1800); |
| 192 | 187 | machine().gfx[3]->set_source(m_characterram + 0x1800); |
| 193 | 188 | |
| 194 | | compute_draw_order(machine()); |
| 189 | compute_draw_order(); |
| 195 | 190 | } |
| 196 | 191 | |
| 197 | 192 | |
| r21022 | r21023 | |
| 251 | 246 | } |
| 252 | 247 | |
| 253 | 248 | |
| 254 | | INLINE int get_sprite_xy(taitosj_state *state, UINT8 which, UINT8* sx, UINT8* sy) |
| 249 | inline int taitosj_state::get_sprite_xy(UINT8 which, UINT8* sx, UINT8* sy) |
| 255 | 250 | { |
| 256 | 251 | offs_t offs = which * 4; |
| 257 | 252 | |
| 258 | | *sx = state->m_spriteram[SPRITE_RAM_PAGE_OFFSET + offs + 0] - 1; |
| 259 | | *sy = 240 - state->m_spriteram[SPRITE_RAM_PAGE_OFFSET + offs + 1]; |
| 253 | *sx = m_spriteram[SPRITE_RAM_PAGE_OFFSET + offs + 0] - 1; |
| 254 | *sy = 240 - m_spriteram[SPRITE_RAM_PAGE_OFFSET + offs + 1]; |
| 260 | 255 | |
| 261 | 256 | return (*sy < 240); |
| 262 | 257 | } |
| 263 | 258 | |
| 264 | 259 | |
| 265 | | INLINE gfx_element *get_sprite_gfx_element(running_machine &machine, UINT8 which) |
| 260 | inline gfx_element * taitosj_state::get_sprite_gfx_element(UINT8 which) |
| 266 | 261 | { |
| 267 | | taitosj_state *state = machine.driver_data<taitosj_state>(); |
| 268 | 262 | offs_t offs = which * 4; |
| 269 | 263 | |
| 270 | | return machine.gfx[(state->m_spriteram[SPRITE_RAM_PAGE_OFFSET + offs + 3] & 0x40) ? 3 : 1]; |
| 264 | return machine().gfx[(m_spriteram[SPRITE_RAM_PAGE_OFFSET + offs + 3] & 0x40) ? 3 : 1]; |
| 271 | 265 | } |
| 272 | 266 | |
| 273 | 267 | |
| 274 | | static int check_sprite_sprite_bitpattern(running_machine &machine, |
| 275 | | int sx1, int sy1, int which1, |
| 276 | | int sx2, int sy2, int which2) |
| 268 | int taitosj_state::check_sprite_sprite_bitpattern(int sx1, int sy1, int which1,int sx2, int sy2, int which2) |
| 277 | 269 | { |
| 278 | | taitosj_state *state = machine.driver_data<taitosj_state>(); |
| 279 | 270 | int x, y, minx, miny, maxx = 16, maxy = 16; |
| 280 | 271 | |
| 281 | 272 | offs_t offs1 = which1 * 4; |
| r21022 | r21023 | |
| 309 | 300 | } |
| 310 | 301 | |
| 311 | 302 | /* draw the sprites into separate bitmaps and check overlapping region */ |
| 312 | | state->m_sprite_layer_collbitmap1.fill(TRANSPARENT_PEN); |
| 313 | | drawgfx_transpen(state->m_sprite_sprite_collbitmap1, state->m_sprite_sprite_collbitmap1.cliprect(), get_sprite_gfx_element(machine, which1), |
| 314 | | state->m_spriteram[SPRITE_RAM_PAGE_OFFSET + offs1 + 3] & 0x3f, |
| 303 | m_sprite_layer_collbitmap1.fill(TRANSPARENT_PEN); |
| 304 | drawgfx_transpen(m_sprite_sprite_collbitmap1, m_sprite_sprite_collbitmap1.cliprect(), get_sprite_gfx_element(which1), |
| 305 | m_spriteram[SPRITE_RAM_PAGE_OFFSET + offs1 + 3] & 0x3f, |
| 315 | 306 | 0, |
| 316 | | state->m_spriteram[SPRITE_RAM_PAGE_OFFSET + offs1 + 2] & 0x01, |
| 317 | | state->m_spriteram[SPRITE_RAM_PAGE_OFFSET + offs1 + 2] & 0x02, |
| 307 | m_spriteram[SPRITE_RAM_PAGE_OFFSET + offs1 + 2] & 0x01, |
| 308 | m_spriteram[SPRITE_RAM_PAGE_OFFSET + offs1 + 2] & 0x02, |
| 318 | 309 | sx1, sy1, 0); |
| 319 | 310 | |
| 320 | | state->m_sprite_sprite_collbitmap2.fill(TRANSPARENT_PEN); |
| 321 | | drawgfx_transpen(state->m_sprite_sprite_collbitmap2, state->m_sprite_sprite_collbitmap2.cliprect(), get_sprite_gfx_element(machine, which2), |
| 322 | | state->m_spriteram[SPRITE_RAM_PAGE_OFFSET + offs2 + 3] & 0x3f, |
| 311 | m_sprite_sprite_collbitmap2.fill(TRANSPARENT_PEN); |
| 312 | drawgfx_transpen(m_sprite_sprite_collbitmap2, m_sprite_sprite_collbitmap2.cliprect(), get_sprite_gfx_element(which2), |
| 313 | m_spriteram[SPRITE_RAM_PAGE_OFFSET + offs2 + 3] & 0x3f, |
| 323 | 314 | 0, |
| 324 | | state->m_spriteram[SPRITE_RAM_PAGE_OFFSET + offs2 + 2] & 0x01, |
| 325 | | state->m_spriteram[SPRITE_RAM_PAGE_OFFSET + offs2 + 2] & 0x02, |
| 315 | m_spriteram[SPRITE_RAM_PAGE_OFFSET + offs2 + 2] & 0x01, |
| 316 | m_spriteram[SPRITE_RAM_PAGE_OFFSET + offs2 + 2] & 0x02, |
| 326 | 317 | sx2, sy2, 0); |
| 327 | 318 | |
| 328 | 319 | for (y = miny; y < maxy; y++) |
| 329 | 320 | for (x = minx; x < maxx; x++) |
| 330 | | if ((state->m_sprite_sprite_collbitmap1.pix16(y, x) != TRANSPARENT_PEN) && |
| 331 | | (state->m_sprite_sprite_collbitmap2.pix16(y, x) != TRANSPARENT_PEN)) |
| 321 | if ((m_sprite_sprite_collbitmap1.pix16(y, x) != TRANSPARENT_PEN) && |
| 322 | (m_sprite_sprite_collbitmap2.pix16(y, x) != TRANSPARENT_PEN)) |
| 332 | 323 | return 1; /* collided */ |
| 333 | 324 | |
| 334 | 325 | return 0; |
| 335 | 326 | } |
| 336 | 327 | |
| 337 | 328 | |
| 338 | | static void check_sprite_sprite_collision(running_machine &machine) |
| 329 | void taitosj_state::check_sprite_sprite_collision() |
| 339 | 330 | { |
| 340 | | taitosj_state *state = machine.driver_data<taitosj_state>(); |
| 341 | 331 | if (SPRITES_ON) |
| 342 | 332 | { |
| 343 | 333 | int which1; |
| r21022 | r21023 | |
| 350 | 340 | |
| 351 | 341 | if ((which1 >= 0x10) && (which1 <= 0x17)) continue; /* no sprites here */ |
| 352 | 342 | |
| 353 | | if (!get_sprite_xy(state, which1, &sx1, &sy1)) continue; |
| 343 | if (!get_sprite_xy(which1, &sx1, &sy1)) continue; |
| 354 | 344 | |
| 355 | 345 | for (which2 = which1 + 1; which2 < 0x20; which2++) |
| 356 | 346 | { |
| r21022 | r21023 | |
| 358 | 348 | |
| 359 | 349 | if ((which2 >= 0x10) && (which2 <= 0x17)) continue; /* no sprites here */ |
| 360 | 350 | |
| 361 | | if (!get_sprite_xy(state, which2, &sx2, &sy2)) continue; |
| 351 | if (!get_sprite_xy(which2, &sx2, &sy2)) continue; |
| 362 | 352 | |
| 363 | 353 | /* quickly rule out any pairs that cannot be touching */ |
| 364 | 354 | if ((abs((INT8)sx1 - (INT8)sx2) < 16) && |
| r21022 | r21023 | |
| 366 | 356 | { |
| 367 | 357 | int reg; |
| 368 | 358 | |
| 369 | | if (!check_sprite_sprite_bitpattern(machine, sx1, sy1, which1, sx2, sy2, which2)) continue; |
| 359 | if (!check_sprite_sprite_bitpattern(sx1, sy1, which1, sx2, sy2, which2)) continue; |
| 370 | 360 | |
| 371 | 361 | /* mark sprite as collided */ |
| 372 | 362 | /* note that only the sprite with the higher number is marked */ |
| r21022 | r21023 | |
| 379 | 369 | reg = which1 >> 3; |
| 380 | 370 | if (reg == 3) reg = 2; |
| 381 | 371 | |
| 382 | | state->m_collision_reg[reg] |= (1 << (which1 & 0x07)); |
| 372 | m_collision_reg[reg] |= (1 << (which1 & 0x07)); |
| 383 | 373 | } |
| 384 | 374 | else |
| 385 | 375 | { |
| 386 | 376 | reg = which2 >> 3; |
| 387 | 377 | if (reg == 3) reg = 2; |
| 388 | 378 | |
| 389 | | state->m_collision_reg[reg] |= (1 << (which2 & 0x07)); |
| 379 | m_collision_reg[reg] |= (1 << (which2 & 0x07)); |
| 390 | 380 | } |
| 391 | 381 | } |
| 392 | 382 | } |
| r21022 | r21023 | |
| 395 | 385 | } |
| 396 | 386 | |
| 397 | 387 | |
| 398 | | static void calculate_sprite_areas(running_machine &machine, int *sprites_on, rectangle *sprite_areas) |
| 388 | void taitosj_state::calculate_sprite_areas(int *sprites_on, rectangle *sprite_areas) |
| 399 | 389 | { |
| 400 | | taitosj_state *state = machine.driver_data<taitosj_state>(); |
| 401 | 390 | int which; |
| 402 | | int width = machine.primary_screen->width(); |
| 403 | | int height = machine.primary_screen->height(); |
| 391 | int width = machine().primary_screen->width(); |
| 392 | int height = machine().primary_screen->height(); |
| 404 | 393 | |
| 405 | 394 | for (which = 0; which < 0x20; which++) |
| 406 | 395 | { |
| r21022 | r21023 | |
| 408 | 397 | |
| 409 | 398 | if ((which >= 0x10) && (which <= 0x17)) continue; /* no sprites here */ |
| 410 | 399 | |
| 411 | | if (get_sprite_xy(state, which, &sx, &sy)) |
| 400 | if (get_sprite_xy(which, &sx, &sy)) |
| 412 | 401 | { |
| 413 | 402 | int minx, miny, maxx, maxy; |
| 414 | 403 | |
| r21022 | r21023 | |
| 446 | 435 | } |
| 447 | 436 | |
| 448 | 437 | |
| 449 | | static int check_sprite_layer_bitpattern(running_machine &machine, int which, rectangle *sprite_areas) |
| 438 | int taitosj_state::check_sprite_layer_bitpattern(int which, rectangle *sprite_areas) |
| 450 | 439 | { |
| 451 | | taitosj_state *state = machine.driver_data<taitosj_state>(); |
| 452 | 440 | int y, x; |
| 453 | 441 | offs_t offs = which * 4; |
| 454 | 442 | int result = 0; /* no collisions */ |
| 455 | 443 | |
| 456 | | int check_layer_1 = *state->m_video_mode & layer_enable_mask[0]; |
| 457 | | int check_layer_2 = *state->m_video_mode & layer_enable_mask[1]; |
| 458 | | int check_layer_3 = *state->m_video_mode & layer_enable_mask[2]; |
| 444 | int check_layer_1 = *m_video_mode & layer_enable_mask[0]; |
| 445 | int check_layer_2 = *m_video_mode & layer_enable_mask[1]; |
| 446 | int check_layer_3 = *m_video_mode & layer_enable_mask[2]; |
| 459 | 447 | |
| 460 | 448 | int minx = sprite_areas[which].min_x; |
| 461 | 449 | int miny = sprite_areas[which].min_y; |
| 462 | 450 | int maxx = sprite_areas[which].max_x + 1; |
| 463 | 451 | int maxy = sprite_areas[which].max_y + 1; |
| 464 | 452 | |
| 465 | | int flip_x = (state->m_spriteram[SPRITE_RAM_PAGE_OFFSET + offs + 2] & 0x01) ^ GLOBAL_FLIP_X; |
| 466 | | int flip_y = (state->m_spriteram[SPRITE_RAM_PAGE_OFFSET + offs + 2] & 0x02) ^ GLOBAL_FLIP_Y; |
| 453 | int flip_x = (m_spriteram[SPRITE_RAM_PAGE_OFFSET + offs + 2] & 0x01) ^ GLOBAL_FLIP_X; |
| 454 | int flip_y = (m_spriteram[SPRITE_RAM_PAGE_OFFSET + offs + 2] & 0x02) ^ GLOBAL_FLIP_Y; |
| 467 | 455 | |
| 468 | 456 | /* draw sprite into a bitmap and check if layers collide */ |
| 469 | | state->m_sprite_layer_collbitmap1.fill(TRANSPARENT_PEN); |
| 470 | | drawgfx_transpen(state->m_sprite_layer_collbitmap1, state->m_sprite_layer_collbitmap1.cliprect(),get_sprite_gfx_element(machine, which), |
| 471 | | state->m_spriteram[SPRITE_RAM_PAGE_OFFSET + offs + 3] & 0x3f, |
| 457 | m_sprite_layer_collbitmap1.fill(TRANSPARENT_PEN); |
| 458 | drawgfx_transpen(m_sprite_layer_collbitmap1, m_sprite_layer_collbitmap1.cliprect(),get_sprite_gfx_element(which), |
| 459 | m_spriteram[SPRITE_RAM_PAGE_OFFSET + offs + 3] & 0x3f, |
| 472 | 460 | 0, |
| 473 | 461 | flip_x, flip_y, |
| 474 | 462 | 0,0,0); |
| 475 | 463 | |
| 476 | 464 | for (y = miny; y < maxy; y++) |
| 477 | 465 | for (x = minx; x < maxx; x++) |
| 478 | | if (state->m_sprite_layer_collbitmap1.pix16(y - miny, x - minx) != TRANSPARENT_PEN) /* is there anything to check for ? */ |
| 466 | if (m_sprite_layer_collbitmap1.pix16(y - miny, x - minx) != TRANSPARENT_PEN) /* is there anything to check for ? */ |
| 479 | 467 | { |
| 480 | | if (check_layer_1 && (state->m_sprite_layer_collbitmap2[0].pix16(y, x) != TRANSPARENT_PEN)) |
| 468 | if (check_layer_1 && (m_sprite_layer_collbitmap2[0].pix16(y, x) != TRANSPARENT_PEN)) |
| 481 | 469 | result |= 0x01; /* collided with layer 1 */ |
| 482 | 470 | |
| 483 | | if (check_layer_2 && (state->m_sprite_layer_collbitmap2[1].pix16(y, x) != TRANSPARENT_PEN)) |
| 471 | if (check_layer_2 && (m_sprite_layer_collbitmap2[1].pix16(y, x) != TRANSPARENT_PEN)) |
| 484 | 472 | result |= 0x02; /* collided with layer 2 */ |
| 485 | 473 | |
| 486 | | if (check_layer_3 && (state->m_sprite_layer_collbitmap2[2].pix16(y, x) != TRANSPARENT_PEN)) |
| 474 | if (check_layer_3 && (m_sprite_layer_collbitmap2[2].pix16(y, x) != TRANSPARENT_PEN)) |
| 487 | 475 | result |= 0x04; /* collided with layer 3 */ |
| 488 | 476 | } |
| 489 | 477 | |
| r21022 | r21023 | |
| 491 | 479 | } |
| 492 | 480 | |
| 493 | 481 | |
| 494 | | static void check_sprite_layer_collision(running_machine &machine, int *sprites_on, rectangle *sprite_areas) |
| 482 | void taitosj_state::check_sprite_layer_collision(int *sprites_on, rectangle *sprite_areas) |
| 495 | 483 | { |
| 496 | | taitosj_state *state = machine.driver_data<taitosj_state>(); |
| 497 | 484 | if (SPRITES_ON) |
| 498 | 485 | { |
| 499 | 486 | int which; |
| r21022 | r21023 | |
| 504 | 491 | if ((which >= 0x10) && (which <= 0x17)) continue; /* no sprites here */ |
| 505 | 492 | |
| 506 | 493 | if (sprites_on[which]) |
| 507 | | state->m_collision_reg[3] |= check_sprite_layer_bitpattern(machine, which, sprite_areas); |
| 494 | m_collision_reg[3] |= check_sprite_layer_bitpattern(which, sprite_areas); |
| 508 | 495 | } |
| 509 | 496 | } |
| 510 | 497 | } |
| 511 | 498 | |
| 512 | 499 | |
| 513 | | static void draw_layers(running_machine &machine) |
| 500 | void taitosj_state::draw_layers() |
| 514 | 501 | { |
| 515 | | taitosj_state *state = machine.driver_data<taitosj_state>(); |
| 516 | 502 | offs_t offs; |
| 517 | 503 | |
| 518 | | state->m_layer_bitmap[0].fill(TRANSPARENT_PEN); |
| 519 | | state->m_layer_bitmap[1].fill(TRANSPARENT_PEN); |
| 520 | | state->m_layer_bitmap[2].fill(TRANSPARENT_PEN); |
| 504 | m_layer_bitmap[0].fill(TRANSPARENT_PEN); |
| 505 | m_layer_bitmap[1].fill(TRANSPARENT_PEN); |
| 506 | m_layer_bitmap[2].fill(TRANSPARENT_PEN); |
| 521 | 507 | |
| 522 | 508 | for (offs = 0; offs < 0x0400; offs++) |
| 523 | 509 | { |
| r21022 | r21023 | |
| 527 | 513 | if (GLOBAL_FLIP_X) sx = 31 - sx; |
| 528 | 514 | if (GLOBAL_FLIP_Y) sy = 31 - sy; |
| 529 | 515 | |
| 530 | | drawgfx_transpen(state->m_layer_bitmap[0],state->m_layer_bitmap[0].cliprect(),machine.gfx[state->m_colorbank[0] & 0x08 ? 2 : 0], |
| 531 | | state->m_videoram_1[offs], |
| 532 | | state->m_colorbank[0] & 0x07, |
| 516 | drawgfx_transpen(m_layer_bitmap[0],m_layer_bitmap[0].cliprect(),machine().gfx[m_colorbank[0] & 0x08 ? 2 : 0], |
| 517 | m_videoram_1[offs], |
| 518 | m_colorbank[0] & 0x07, |
| 533 | 519 | GLOBAL_FLIP_X,GLOBAL_FLIP_Y, |
| 534 | 520 | 8*sx,8*sy,0); |
| 535 | 521 | |
| 536 | | drawgfx_transpen(state->m_layer_bitmap[1],state->m_layer_bitmap[1].cliprect(),machine.gfx[state->m_colorbank[0] & 0x80 ? 2 : 0], |
| 537 | | state->m_videoram_2[offs], |
| 538 | | (state->m_colorbank[0] >> 4) & 0x07, |
| 522 | drawgfx_transpen(m_layer_bitmap[1],m_layer_bitmap[1].cliprect(),machine().gfx[m_colorbank[0] & 0x80 ? 2 : 0], |
| 523 | m_videoram_2[offs], |
| 524 | (m_colorbank[0] >> 4) & 0x07, |
| 539 | 525 | GLOBAL_FLIP_X,GLOBAL_FLIP_Y, |
| 540 | 526 | 8*sx,8*sy,0); |
| 541 | 527 | |
| 542 | | drawgfx_transpen(state->m_layer_bitmap[2],state->m_layer_bitmap[2].cliprect(),machine.gfx[state->m_colorbank[1] & 0x08 ? 2 : 0], |
| 543 | | state->m_videoram_3[offs], |
| 544 | | state->m_colorbank[1] & 0x07, |
| 528 | drawgfx_transpen(m_layer_bitmap[2],m_layer_bitmap[2].cliprect(),machine().gfx[m_colorbank[1] & 0x08 ? 2 : 0], |
| 529 | m_videoram_3[offs], |
| 530 | m_colorbank[1] & 0x07, |
| 545 | 531 | GLOBAL_FLIP_X,GLOBAL_FLIP_Y, |
| 546 | 532 | 8*sx,8*sy,0); |
| 547 | 533 | } |
| 548 | 534 | } |
| 549 | 535 | |
| 550 | 536 | |
| 551 | | static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap) |
| 537 | void taitosj_state::draw_sprites(bitmap_ind16 &bitmap) |
| 552 | 538 | { |
| 553 | | taitosj_state *state = machine.driver_data<taitosj_state>(); |
| 554 | 539 | /* |
| 555 | 540 | sprite visibility area is missing 4 pixels from the sides, surely to reduce |
| 556 | 541 | wraparound side effects. This was verified on a real Elevator Action. |
| r21022 | r21023 | |
| 574 | 559 | |
| 575 | 560 | if ((which >= 0x10) && (which <= 0x17)) continue; /* no sprites here */ |
| 576 | 561 | |
| 577 | | if (get_sprite_xy(state, which, &sx, &sy)) |
| 562 | if (get_sprite_xy(which, &sx, &sy)) |
| 578 | 563 | { |
| 579 | | int code = state->m_spriteram[SPRITE_RAM_PAGE_OFFSET + offs + 3] & 0x3f; |
| 580 | | int color = 2 * ((state->m_colorbank[1] >> 4) & 0x03) + ((state->m_spriteram[SPRITE_RAM_PAGE_OFFSET + offs + 2] >> 2) & 0x01); |
| 581 | | int flip_x = state->m_spriteram[SPRITE_RAM_PAGE_OFFSET + offs + 2] & 0x01; |
| 582 | | int flip_y = state->m_spriteram[SPRITE_RAM_PAGE_OFFSET + offs + 2] & 0x02; |
| 564 | int code = m_spriteram[SPRITE_RAM_PAGE_OFFSET + offs + 3] & 0x3f; |
| 565 | int color = 2 * ((m_colorbank[1] >> 4) & 0x03) + ((m_spriteram[SPRITE_RAM_PAGE_OFFSET + offs + 2] >> 2) & 0x01); |
| 566 | int flip_x = m_spriteram[SPRITE_RAM_PAGE_OFFSET + offs + 2] & 0x01; |
| 567 | int flip_y = m_spriteram[SPRITE_RAM_PAGE_OFFSET + offs + 2] & 0x02; |
| 583 | 568 | |
| 584 | 569 | if (GLOBAL_FLIP_X) |
| 585 | 570 | { |
| r21022 | r21023 | |
| 593 | 578 | flip_y = !flip_y; |
| 594 | 579 | } |
| 595 | 580 | |
| 596 | | drawgfx_transpen(bitmap, GLOBAL_FLIP_X ? spritevisibleareaflip : spritevisiblearea,get_sprite_gfx_element(machine, which), code, color, |
| 581 | drawgfx_transpen(bitmap, GLOBAL_FLIP_X ? spritevisibleareaflip : spritevisiblearea,get_sprite_gfx_element(which), code, color, |
| 597 | 582 | flip_x, flip_y, sx, sy,0); |
| 598 | 583 | |
| 599 | 584 | /* draw with wrap around. The horizontal games (eg. sfposeid) need this */ |
| 600 | | drawgfx_transpen(bitmap, GLOBAL_FLIP_X ? spritevisibleareaflip : spritevisiblearea,get_sprite_gfx_element(machine, which), code, color, |
| 585 | drawgfx_transpen(bitmap, GLOBAL_FLIP_X ? spritevisibleareaflip : spritevisiblearea,get_sprite_gfx_element(which), code, color, |
| 601 | 586 | flip_x, flip_y, sx - 0x100, sy,0); |
| 602 | 587 | } |
| 603 | 588 | } |
| r21022 | r21023 | |
| 605 | 590 | } |
| 606 | 591 | |
| 607 | 592 | |
| 608 | | static void taitosj_copy_layer(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, |
| 609 | | int which, int *sprites_on, rectangle *sprite_areas) |
| 593 | void taitosj_state::taitosj_copy_layer(bitmap_ind16 &bitmap, const rectangle &cliprect,int which, int *sprites_on, rectangle *sprite_areas) |
| 610 | 594 | { |
| 611 | | taitosj_state *state = machine.driver_data<taitosj_state>(); |
| 612 | 595 | static const int fudge1[3] = { 3, 1, -1 }; |
| 613 | 596 | static const int fudge2[3] = { 8, 10, 12 }; |
| 614 | 597 | |
| 615 | | if (*state->m_video_mode & layer_enable_mask[which]) |
| 598 | if (*m_video_mode & layer_enable_mask[which]) |
| 616 | 599 | { |
| 617 | 600 | int i, scrollx, scrolly[32]; |
| 618 | 601 | |
| 619 | | scrollx = state->m_scroll[2 * which]; |
| 602 | scrollx = m_scroll[2 * which]; |
| 620 | 603 | |
| 621 | 604 | if (GLOBAL_FLIP_X) |
| 622 | 605 | scrollx = (scrollx & 0xf8) + ((scrollx + fudge1[which]) & 7) + fudge2[which]; |
| r21022 | r21023 | |
| 625 | 608 | |
| 626 | 609 | if (GLOBAL_FLIP_Y) |
| 627 | 610 | for (i = 0;i < 32;i++) |
| 628 | | scrolly[31 - i] = state->m_colscrolly[32 * which + i] + state->m_scroll[2 * which + 1]; |
| 611 | scrolly[31 - i] = m_colscrolly[32 * which + i] + m_scroll[2 * which + 1]; |
| 629 | 612 | else |
| 630 | 613 | for (i = 0;i < 32;i++) |
| 631 | | scrolly[i] = -state->m_colscrolly[32 * which + i] - state->m_scroll[2 * which + 1]; |
| 614 | scrolly[i] = -m_colscrolly[32 * which + i] - m_scroll[2 * which + 1]; |
| 632 | 615 | |
| 633 | | copyscrollbitmap_trans(bitmap, state->m_layer_bitmap[which], 1, &scrollx, 32, scrolly, cliprect, TRANSPARENT_PEN); |
| 616 | copyscrollbitmap_trans(bitmap, m_layer_bitmap[which], 1, &scrollx, 32, scrolly, cliprect, TRANSPARENT_PEN); |
| 634 | 617 | |
| 635 | 618 | /* store parts covered with sprites for sprites/layers collision detection */ |
| 636 | 619 | for (i = 0; i < 0x20; i++) |
| r21022 | r21023 | |
| 638 | 621 | if ((i >= 0x10) && (i <= 0x17)) continue; /* no sprites here */ |
| 639 | 622 | |
| 640 | 623 | if (sprites_on[i]) |
| 641 | | copyscrollbitmap(state->m_sprite_layer_collbitmap2[which], state->m_layer_bitmap[which], 1, &scrollx, 32, scrolly, sprite_areas[i]); |
| 624 | copyscrollbitmap(m_sprite_layer_collbitmap2[which], m_layer_bitmap[which], 1, &scrollx, 32, scrolly, sprite_areas[i]); |
| 642 | 625 | } |
| 643 | 626 | } |
| 644 | 627 | } |
| 645 | 628 | |
| 646 | 629 | |
| 647 | | static void kikstart_copy_layer(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, |
| 648 | | int which, int *sprites_on, rectangle *sprite_areas) |
| 630 | void taitosj_state::kikstart_copy_layer(bitmap_ind16 &bitmap, const rectangle &cliprect,int which, int *sprites_on, rectangle *sprite_areas) |
| 649 | 631 | { |
| 650 | | taitosj_state *state = machine.driver_data<taitosj_state>(); |
| 651 | | if (*state->m_video_mode & layer_enable_mask[which]) |
| 632 | if (*m_video_mode & layer_enable_mask[which]) |
| 652 | 633 | { |
| 653 | 634 | int i, scrolly, scrollx[32 * 8]; |
| 654 | 635 | |
| r21022 | r21023 | |
| 657 | 638 | switch (which) |
| 658 | 639 | { |
| 659 | 640 | case 0: scrollx[32 * 8 - i] = 0 ;break; |
| 660 | | case 1: scrollx[32 * 8 - i] = state->m_kikstart_scrollram[i] + ((state->m_scroll[2 * which] + 0x0a) & 0xff);break; |
| 661 | | case 2: scrollx[32 * 8 - i] = state->m_kikstart_scrollram[0x100 + i] + ((state->m_scroll[2 * which] + 0xc) & 0xff);break; |
| 641 | case 1: scrollx[32 * 8 - i] = m_kikstart_scrollram[i] + ((m_scroll[2 * which] + 0x0a) & 0xff);break; |
| 642 | case 2: scrollx[32 * 8 - i] = m_kikstart_scrollram[0x100 + i] + ((m_scroll[2 * which] + 0xc) & 0xff);break; |
| 662 | 643 | } |
| 663 | 644 | else |
| 664 | 645 | switch (which) |
| 665 | 646 | { |
| 666 | 647 | case 0: scrollx[i] = 0 ;break; |
| 667 | | case 1: scrollx[i] = 0xff - state->m_kikstart_scrollram[i - 1] - ((state->m_scroll[2 * which] - 0x10) & 0xff);break; |
| 668 | | case 2: scrollx[i] = 0xff - state->m_kikstart_scrollram[0x100 + i - 1] - ((state->m_scroll[2 * which] - 0x12) & 0xff);break; |
| 648 | case 1: scrollx[i] = 0xff - m_kikstart_scrollram[i - 1] - ((m_scroll[2 * which] - 0x10) & 0xff);break; |
| 649 | case 2: scrollx[i] = 0xff - m_kikstart_scrollram[0x100 + i - 1] - ((m_scroll[2 * which] - 0x12) & 0xff);break; |
| 669 | 650 | } |
| 670 | 651 | |
| 671 | | scrolly = state->m_scroll[2 * which + 1]; /* always 0 */ |
| 672 | | copyscrollbitmap_trans(bitmap, state->m_layer_bitmap[which], 32 * 8, scrollx, 1, &scrolly, cliprect, TRANSPARENT_PEN); |
| 652 | scrolly = m_scroll[2 * which + 1]; /* always 0 */ |
| 653 | copyscrollbitmap_trans(bitmap, m_layer_bitmap[which], 32 * 8, scrollx, 1, &scrolly, cliprect, TRANSPARENT_PEN); |
| 673 | 654 | |
| 674 | 655 | /* store parts covered with sprites for sprites/layers collision detection */ |
| 675 | 656 | for (i = 0; i < 0x20; i++) |
| r21022 | r21023 | |
| 677 | 658 | if ((i >= 0x10) && (i <= 0x17)) continue; /* no sprites here */ |
| 678 | 659 | |
| 679 | 660 | if (sprites_on[i]) |
| 680 | | copyscrollbitmap(state->m_sprite_layer_collbitmap2[which], state->m_layer_bitmap[which], 32 * 8, scrollx, 1, &scrolly, sprite_areas[i]); |
| 661 | copyscrollbitmap(m_sprite_layer_collbitmap2[which], m_layer_bitmap[which], 32 * 8, scrollx, 1, &scrolly, sprite_areas[i]); |
| 681 | 662 | } |
| 682 | 663 | } |
| 683 | 664 | } |
| 684 | 665 | |
| 685 | 666 | |
| 686 | | static void copy_layer(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, |
| 687 | | copy_layer_func_t copy_layer_func, int which, int *sprites_on, rectangle *sprite_areas) |
| 667 | void taitosj_state::copy_layer(bitmap_ind16 &bitmap, const rectangle &cliprect,copy_layer_func_t copy_layer_func, int which, int *sprites_on, rectangle *sprite_areas) |
| 688 | 668 | { |
| 689 | 669 | if (which == 0) |
| 690 | | draw_sprites(machine, bitmap); |
| 670 | draw_sprites(bitmap); |
| 691 | 671 | else |
| 692 | | copy_layer_func(machine, bitmap, cliprect, which - 1, sprites_on, sprite_areas); |
| 672 | (this->*copy_layer_func)(bitmap, cliprect, which - 1, sprites_on, sprite_areas); |
| 693 | 673 | } |
| 694 | 674 | |
| 695 | 675 | |
| 696 | | static void copy_layers(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, |
| 697 | | copy_layer_func_t copy_layer_func, int *sprites_on, rectangle *sprite_areas) |
| 676 | void taitosj_state::copy_layers(bitmap_ind16 &bitmap, const rectangle &cliprect,copy_layer_func_t copy_layer_func, int *sprites_on, rectangle *sprite_areas) |
| 698 | 677 | { |
| 699 | | taitosj_state *state = machine.driver_data<taitosj_state>(); |
| 700 | 678 | int i = 0; |
| 701 | 679 | |
| 702 | 680 | /* fill the screen with the background color */ |
| 703 | | bitmap.fill(8 * (state->m_colorbank[1] & 0x07), cliprect); |
| 681 | bitmap.fill(8 * (m_colorbank[1] & 0x07), cliprect); |
| 704 | 682 | |
| 705 | 683 | for (i = 0; i < 4; i++) |
| 706 | 684 | { |
| 707 | | int which = state->m_draw_order[*state->m_video_priority & 0x1f][i]; |
| 685 | int which = m_draw_order[*m_video_priority & 0x1f][i]; |
| 708 | 686 | |
| 709 | | copy_layer(machine, bitmap, cliprect, copy_layer_func, which, sprites_on, sprite_areas); |
| 687 | copy_layer(bitmap, cliprect, copy_layer_func, which, sprites_on, sprite_areas); |
| 710 | 688 | } |
| 711 | 689 | } |
| 712 | 690 | |
| 713 | 691 | |
| 714 | | static void check_collision(running_machine &machine, int *sprites_on, rectangle *sprite_areas) |
| 692 | void taitosj_state::check_collision(int *sprites_on, rectangle *sprite_areas) |
| 715 | 693 | { |
| 716 | | check_sprite_sprite_collision(machine); |
| 694 | check_sprite_sprite_collision(); |
| 717 | 695 | |
| 718 | | check_sprite_layer_collision(machine, sprites_on, sprite_areas); |
| 696 | check_sprite_layer_collision(sprites_on, sprite_areas); |
| 719 | 697 | |
| 720 | 698 | /*check_layer_layer_collision();*/ /* not implemented !!! */ |
| 721 | 699 | } |
| 722 | 700 | |
| 723 | 701 | |
| 724 | | static int video_update_common(running_machine &machine, bitmap_ind16 &bitmap, |
| 725 | | const rectangle &cliprect, copy_layer_func_t copy_layer_func) |
| 702 | int taitosj_state::video_update_common(bitmap_ind16 &bitmap, const rectangle &cliprect, copy_layer_func_t copy_layer_func) |
| 726 | 703 | { |
| 727 | 704 | int sprites_on[0x20]; /* 1 if sprite is active */ |
| 728 | 705 | rectangle sprite_areas[0x20]; /* areas on bitmap (sprite locations) */ |
| 729 | 706 | |
| 730 | | set_pens(machine); |
| 707 | set_pens(); |
| 731 | 708 | |
| 732 | | draw_layers(machine); |
| 709 | draw_layers(); |
| 733 | 710 | |
| 734 | | calculate_sprite_areas(machine, sprites_on, sprite_areas); |
| 711 | calculate_sprite_areas(sprites_on, sprite_areas); |
| 735 | 712 | |
| 736 | | copy_layers(machine, bitmap, cliprect, copy_layer_func, sprites_on, sprite_areas); |
| 713 | copy_layers(bitmap, cliprect, copy_layer_func, sprites_on, sprite_areas); |
| 737 | 714 | |
| 738 | 715 | /*check_sprite_layer_collision() uses drawn bitmaps, so it must me called _AFTER_ draw_layers() */ |
| 739 | | check_collision(machine, sprites_on, sprite_areas); |
| 716 | check_collision(sprites_on, sprite_areas); |
| 740 | 717 | |
| 741 | 718 | return 0; |
| 742 | 719 | } |
| r21022 | r21023 | |
| 744 | 721 | |
| 745 | 722 | UINT32 taitosj_state::screen_update_taitosj(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) |
| 746 | 723 | { |
| 747 | | return video_update_common(machine(), bitmap, cliprect, taitosj_copy_layer); |
| 724 | return video_update_common(bitmap, cliprect, &taitosj_state::taitosj_copy_layer); |
| 748 | 725 | } |
| 749 | 726 | |
| 750 | 727 | |
| 751 | 728 | UINT32 taitosj_state::screen_update_kikstart(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) |
| 752 | 729 | { |
| 753 | | return video_update_common(machine(), bitmap, cliprect, kikstart_copy_layer); |
| 730 | return video_update_common(bitmap, cliprect, &taitosj_state::kikstart_copy_layer); |
| 754 | 731 | } |
trunk/src/mame/video/tumbleb.c
| r21022 | r21023 | |
| 116 | 116 | return (col & 0x1f) + ((row & 0x1f) << 5) + ((col & 0x60) << 5); |
| 117 | 117 | } |
| 118 | 118 | |
| 119 | | INLINE void get_bg_tile_info( running_machine &machine, tile_data &tileinfo, int tile_index, int gfx_bank, UINT16 *gfx_base) |
| 119 | inline void tumbleb_state::get_bg_tile_info( tile_data &tileinfo, int tile_index, int gfx_bank, UINT16 *gfx_base) |
| 120 | 120 | { |
| 121 | | tumbleb_state *state = machine.driver_data<tumbleb_state>(); |
| 122 | 121 | int data = gfx_base[tile_index]; |
| 123 | 122 | |
| 124 | | SET_TILE_INFO( |
| 123 | SET_TILE_INFO_MEMBER( |
| 125 | 124 | gfx_bank, |
| 126 | | (data & 0x0fff) | (state->m_tilebank >> 2), |
| 125 | (data & 0x0fff) | (m_tilebank >> 2), |
| 127 | 126 | data >> 12, |
| 128 | 127 | 0); |
| 129 | 128 | } |
| 130 | 129 | |
| 131 | | TILE_GET_INFO_MEMBER(tumbleb_state::get_bg1_tile_info){ get_bg_tile_info(machine(), tileinfo, tile_index, 2, m_pf1_data); } |
| 132 | | TILE_GET_INFO_MEMBER(tumbleb_state::get_bg2_tile_info){ get_bg_tile_info(machine(), tileinfo, tile_index, 1, m_pf2_data); } |
| 130 | TILE_GET_INFO_MEMBER(tumbleb_state::get_bg1_tile_info){ get_bg_tile_info(tileinfo, tile_index, 2, m_pf1_data); } |
| 131 | TILE_GET_INFO_MEMBER(tumbleb_state::get_bg2_tile_info){ get_bg_tile_info(tileinfo, tile_index, 1, m_pf2_data); } |
| 133 | 132 | |
| 134 | 133 | TILE_GET_INFO_MEMBER(tumbleb_state::get_fg_tile_info) |
| 135 | 134 | { |
| r21022 | r21023 | |
| 142 | 141 | 0); |
| 143 | 142 | } |
| 144 | 143 | |
| 145 | | INLINE void get_fncywld_bg_tile_info( running_machine &machine, tile_data &tileinfo, int tile_index, int gfx_bank, UINT16 *gfx_base) |
| 144 | inline void tumbleb_state::get_fncywld_bg_tile_info( tile_data &tileinfo, int tile_index, int gfx_bank, UINT16 *gfx_base) |
| 146 | 145 | { |
| 147 | 146 | int data = gfx_base[tile_index * 2]; |
| 148 | 147 | int attr = gfx_base[tile_index * 2 + 1]; |
| 149 | 148 | |
| 150 | | SET_TILE_INFO( |
| 149 | SET_TILE_INFO_MEMBER( |
| 151 | 150 | gfx_bank, |
| 152 | 151 | data & 0x1fff, |
| 153 | 152 | attr & 0x1f, |
| 154 | 153 | 0); |
| 155 | 154 | } |
| 156 | 155 | |
| 157 | | TILE_GET_INFO_MEMBER(tumbleb_state::get_fncywld_bg1_tile_info){ get_fncywld_bg_tile_info(machine(), tileinfo, tile_index, 2, m_pf1_data); } |
| 158 | | TILE_GET_INFO_MEMBER(tumbleb_state::get_fncywld_bg2_tile_info){ get_fncywld_bg_tile_info(machine(), tileinfo, tile_index, 1, m_pf2_data); } |
| 156 | TILE_GET_INFO_MEMBER(tumbleb_state::get_fncywld_bg1_tile_info){ get_fncywld_bg_tile_info(tileinfo, tile_index, 2, m_pf1_data); } |
| 157 | TILE_GET_INFO_MEMBER(tumbleb_state::get_fncywld_bg2_tile_info){ get_fncywld_bg_tile_info(tileinfo, tile_index, 1, m_pf2_data); } |
| 159 | 158 | |
| 160 | 159 | TILE_GET_INFO_MEMBER(tumbleb_state::get_fncywld_fg_tile_info) |
| 161 | 160 | { |
| r21022 | r21023 | |
| 170 | 169 | } |
| 171 | 170 | |
| 172 | 171 | |
| 173 | | INLINE void pangpang_get_bg_tile_info( running_machine &machine, tile_data &tileinfo, int tile_index, int gfx_bank, UINT16 *gfx_base ) |
| 172 | inline void tumbleb_state::pangpang_get_bg_tile_info( tile_data &tileinfo, int tile_index, int gfx_bank, UINT16 *gfx_base ) |
| 174 | 173 | { |
| 175 | 174 | int data = gfx_base[tile_index * 2 + 1]; |
| 176 | 175 | int attr = gfx_base[tile_index * 2]; |
| 177 | 176 | |
| 178 | | SET_TILE_INFO( |
| 177 | SET_TILE_INFO_MEMBER( |
| 179 | 178 | gfx_bank, |
| 180 | 179 | data & 0x1fff, |
| 181 | 180 | (attr >>12) & 0xf, |
| 182 | 181 | 0); |
| 183 | 182 | } |
| 184 | 183 | |
| 185 | | INLINE void pangpang_get_bg2x_tile_info( running_machine &machine, tile_data &tileinfo, int tile_index, int gfx_bank, UINT16 *gfx_base ) |
| 184 | inline void tumbleb_state::pangpang_get_bg2x_tile_info( tile_data &tileinfo, int tile_index, int gfx_bank, UINT16 *gfx_base ) |
| 186 | 185 | { |
| 187 | 186 | int data = gfx_base[tile_index * 2 + 1]; |
| 188 | 187 | int attr = gfx_base[tile_index * 2]; |
| 189 | 188 | |
| 190 | | SET_TILE_INFO( |
| 189 | SET_TILE_INFO_MEMBER( |
| 191 | 190 | gfx_bank, |
| 192 | 191 | (data & 0xfff) + 0x1000, |
| 193 | 192 | (attr >>12) & 0xf, |
| r21022 | r21023 | |
| 195 | 194 | } |
| 196 | 195 | |
| 197 | 196 | |
| 198 | | TILE_GET_INFO_MEMBER(tumbleb_state::pangpang_get_bg1_tile_info){ pangpang_get_bg_tile_info(machine(), tileinfo, tile_index, 2, m_pf1_data); } |
| 199 | | TILE_GET_INFO_MEMBER(tumbleb_state::pangpang_get_bg2_tile_info){ pangpang_get_bg2x_tile_info(machine(), tileinfo, tile_index, 1, m_pf2_data); } |
| 197 | TILE_GET_INFO_MEMBER(tumbleb_state::pangpang_get_bg1_tile_info){ pangpang_get_bg_tile_info(tileinfo, tile_index, 2, m_pf1_data); } |
| 198 | TILE_GET_INFO_MEMBER(tumbleb_state::pangpang_get_bg2_tile_info){ pangpang_get_bg2x_tile_info(tileinfo, tile_index, 1, m_pf2_data); } |
| 200 | 199 | |
| 201 | 200 | TILE_GET_INFO_MEMBER(tumbleb_state::pangpang_get_fg_tile_info) |
| 202 | 201 | { |
| r21022 | r21023 | |
| 283 | 282 | |
| 284 | 283 | /******************************************************************************/ |
| 285 | 284 | |
| 286 | | void tumbleb_draw_common(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int pf1x_offs, int pf1y_offs, int pf2x_offs, int pf2y_offs) |
| 285 | void tumbleb_state::tumbleb_draw_common(bitmap_ind16 &bitmap, const rectangle &cliprect, int pf1x_offs, int pf1y_offs, int pf2x_offs, int pf2y_offs) |
| 287 | 286 | { |
| 288 | | tumbleb_state *state = machine.driver_data<tumbleb_state>(); |
| 289 | 287 | |
| 290 | | state->m_pf1_tilemap->set_scrollx(0, state->m_control_0[1] + pf1x_offs); |
| 291 | | state->m_pf1_tilemap->set_scrolly(0, state->m_control_0[2] + pf1y_offs); |
| 292 | | state->m_pf1_alt_tilemap->set_scrollx(0, state->m_control_0[1] + pf1x_offs); |
| 293 | | state->m_pf1_alt_tilemap->set_scrolly(0, state->m_control_0[2] + pf1y_offs); |
| 294 | | state->m_pf2_tilemap->set_scrollx(0, state->m_control_0[3] + pf2x_offs); |
| 295 | | state->m_pf2_tilemap->set_scrolly(0, state->m_control_0[4] + pf2y_offs); |
| 288 | m_pf1_tilemap->set_scrollx(0, m_control_0[1] + pf1x_offs); |
| 289 | m_pf1_tilemap->set_scrolly(0, m_control_0[2] + pf1y_offs); |
| 290 | m_pf1_alt_tilemap->set_scrollx(0, m_control_0[1] + pf1x_offs); |
| 291 | m_pf1_alt_tilemap->set_scrolly(0, m_control_0[2] + pf1y_offs); |
| 292 | m_pf2_tilemap->set_scrollx(0, m_control_0[3] + pf2x_offs); |
| 293 | m_pf2_tilemap->set_scrolly(0, m_control_0[4] + pf2y_offs); |
| 296 | 294 | |
| 297 | | state->m_pf2_tilemap->draw(bitmap, cliprect, 0, 0); |
| 295 | m_pf2_tilemap->draw(bitmap, cliprect, 0, 0); |
| 298 | 296 | |
| 299 | | if (state->m_control_0[6] & 0x80) |
| 300 | | state->m_pf1_tilemap->draw(bitmap, cliprect, 0, 0); |
| 297 | if (m_control_0[6] & 0x80) |
| 298 | m_pf1_tilemap->draw(bitmap, cliprect, 0, 0); |
| 301 | 299 | else |
| 302 | | state->m_pf1_alt_tilemap->draw(bitmap, cliprect, 0, 0); |
| 300 | m_pf1_alt_tilemap->draw(bitmap, cliprect, 0, 0); |
| 303 | 301 | |
| 304 | | machine.device<decospr_device>("spritegen")->draw_sprites(bitmap, cliprect, state->m_spriteram, state->m_spriteram.bytes()/2); |
| 302 | machine().device<decospr_device>("spritegen")->draw_sprites(bitmap, cliprect, m_spriteram, m_spriteram.bytes()/2); |
| 305 | 303 | } |
| 306 | 304 | |
| 307 | 305 | UINT32 tumbleb_state::screen_update_tumblepb(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) |
| r21022 | r21023 | |
| 321 | 319 | else |
| 322 | 320 | offs2 = -5; |
| 323 | 321 | |
| 324 | | tumbleb_draw_common(machine(),bitmap,cliprect, offs2, 0, offs, 0); |
| 322 | tumbleb_draw_common(bitmap,cliprect, offs2, 0, offs, 0); |
| 325 | 323 | |
| 326 | 324 | return 0; |
| 327 | 325 | } |
| r21022 | r21023 | |
| 343 | 341 | else |
| 344 | 342 | offs2 = -5; |
| 345 | 343 | |
| 346 | | tumbleb_draw_common(machine(),bitmap,cliprect, offs2, 0, offs, 0); |
| 344 | tumbleb_draw_common(bitmap,cliprect, offs2, 0, offs, 0); |
| 347 | 345 | return 0; |
| 348 | 346 | } |
| 349 | 347 | |
| r21022 | r21023 | |
| 364 | 362 | else |
| 365 | 363 | offs2 = -5; |
| 366 | 364 | |
| 367 | | tumbleb_draw_common(machine(),bitmap,cliprect, offs2, 0, offs, 0); |
| 365 | tumbleb_draw_common(bitmap,cliprect, offs2, 0, offs, 0); |
| 368 | 366 | return 0; |
| 369 | 367 | } |
| 370 | 368 | |
| r21022 | r21023 | |
| 378 | 376 | offsy = 2; |
| 379 | 377 | offsx2 = -5; |
| 380 | 378 | |
| 381 | | tumbleb_draw_common(machine(),bitmap,cliprect, offsx2, 0, offsx, offsy); |
| 379 | tumbleb_draw_common(bitmap,cliprect, offsx2, 0, offsx, offsy); |
| 382 | 380 | |
| 383 | 381 | return 0; |
| 384 | 382 | } |
| r21022 | r21023 | |
| 402 | 400 | else |
| 403 | 401 | offs2 = 8; |
| 404 | 402 | |
| 405 | | tumbleb_draw_common(machine(),bitmap,cliprect, offs2, 0, offs, 0); |
| 403 | tumbleb_draw_common(bitmap,cliprect, offs2, 0, offs, 0); |
| 406 | 404 | return 0; |
| 407 | 405 | } |
| 408 | 406 | |
| r21022 | r21023 | |
| 415 | 413 | offs = -1; |
| 416 | 414 | offs2 = -2; |
| 417 | 415 | |
| 418 | | tumbleb_draw_common(machine(),bitmap,cliprect, offs2, 0, offs, 0); |
| 416 | tumbleb_draw_common(bitmap,cliprect, offs2, 0, offs, 0); |
| 419 | 417 | |
| 420 | 418 | return 0; |
| 421 | 419 | } |
| r21022 | r21023 | |
| 429 | 427 | offs = -1; |
| 430 | 428 | offs2 = -5; // foreground scroll.. |
| 431 | 429 | |
| 432 | | tumbleb_draw_common(machine(),bitmap,cliprect, offs2, -16, offs, 0); |
| 430 | tumbleb_draw_common(bitmap,cliprect, offs2, -16, offs, 0); |
| 433 | 431 | |
| 434 | 432 | m_sprgen->draw_sprites(bitmap, cliprect, m_spriteram, m_spriteram.bytes()/2); |
| 435 | 433 | return 0; |
| r21022 | r21023 | |
| 452 | 450 | else |
| 453 | 451 | offs2 = -5; |
| 454 | 452 | |
| 455 | | tumbleb_draw_common(machine(),bitmap,cliprect, offs2, 0, offs, 0); |
| 453 | tumbleb_draw_common(bitmap,cliprect, offs2, 0, offs, 0); |
| 456 | 454 | |
| 457 | 455 | return 0; |
| 458 | 456 | } |
| r21022 | r21023 | |
| 474 | 472 | else |
| 475 | 473 | offs2 = -5; |
| 476 | 474 | |
| 477 | | tumbleb_draw_common(machine(),bitmap,cliprect, offs2, 0, offs, 0); |
| 475 | tumbleb_draw_common(bitmap,cliprect, offs2, 0, offs, 0); |
| 478 | 476 | return 0; |
| 479 | 477 | } |
| 480 | 478 | |
trunk/src/mame/video/taito_z.c
| r21022 | r21023 | |
| 143 | 143 | ********************************************************/ |
| 144 | 144 | |
| 145 | 145 | |
| 146 | | static void contcirc_draw_sprites_16x8( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int y_offs ) |
| 146 | void taitoz_state::contcirc_draw_sprites_16x8( bitmap_ind16 &bitmap, const rectangle &cliprect, int y_offs ) |
| 147 | 147 | { |
| 148 | | taitoz_state *state = machine.driver_data<taitoz_state>(); |
| 149 | | UINT16 *spritemap = (UINT16 *)state->memregion("user1")->base(); |
| 150 | | UINT16 *spriteram = state->m_spriteram; |
| 148 | UINT16 *spritemap = (UINT16 *)memregion("user1")->base(); |
| 149 | UINT16 *spriteram = m_spriteram; |
| 151 | 150 | int offs, data, tilenum, color, flipx, flipy; |
| 152 | 151 | int x, y, priority, curx, cury; |
| 153 | 152 | int sprites_flipscreen = 0; |
| r21022 | r21023 | |
| 156 | 155 | int bad_chunks; |
| 157 | 156 | static const int primasks[2] = { 0xf0, 0xfc }; |
| 158 | 157 | |
| 159 | | for (offs = 0; offs < state->m_spriteram.bytes() / 2; offs += 4) |
| 158 | for (offs = 0; offs < m_spriteram.bytes() / 2; offs += 4) |
| 160 | 159 | { |
| 161 | 160 | data = spriteram[offs + 0]; |
| 162 | 161 | zoomy = (data & 0xfe00) >> 9; |
| r21022 | r21023 | |
| 223 | 222 | flipy = !flipy; |
| 224 | 223 | } |
| 225 | 224 | |
| 226 | | pdrawgfxzoom_transpen(bitmap,cliprect,machine.gfx[0], |
| 225 | pdrawgfxzoom_transpen(bitmap,cliprect,machine().gfx[0], |
| 227 | 226 | code, |
| 228 | 227 | color, |
| 229 | 228 | flipx,flipy, |
| 230 | 229 | curx,cury, |
| 231 | | zx<<12,zy<<13,machine.priority_bitmap,primasks[priority],0); |
| 230 | zx<<12,zy<<13,machine().priority_bitmap,primasks[priority],0); |
| 232 | 231 | } |
| 233 | 232 | |
| 234 | 233 | if (bad_chunks) |
| r21022 | r21023 | |
| 238 | 237 | |
| 239 | 238 | |
| 240 | 239 | |
| 241 | | static void chasehq_draw_sprites_16x16( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int y_offs ) |
| 240 | void taitoz_state::chasehq_draw_sprites_16x16( bitmap_ind16 &bitmap, const rectangle &cliprect, int y_offs ) |
| 242 | 241 | { |
| 243 | | taitoz_state *state = machine.driver_data<taitoz_state>(); |
| 244 | | UINT16 *spritemap = (UINT16 *)state->memregion("user1")->base(); |
| 245 | | UINT16 *spriteram = state->m_spriteram; |
| 242 | UINT16 *spritemap = (UINT16 *)memregion("user1")->base(); |
| 243 | UINT16 *spriteram = m_spriteram; |
| 246 | 244 | int offs, data, tilenum, color, flipx, flipy; |
| 247 | 245 | int x, y, priority, curx, cury; |
| 248 | 246 | int sprites_flipscreen = 0; |
| r21022 | r21023 | |
| 251 | 249 | int bad_chunks; |
| 252 | 250 | static const int primasks[2] = { 0xf0, 0xfc }; |
| 253 | 251 | |
| 254 | | for (offs = state->m_spriteram.bytes() / 2 - 4; offs >= 0; offs -= 4) |
| 252 | for (offs = m_spriteram.bytes() / 2 - 4; offs >= 0; offs -= 4) |
| 255 | 253 | { |
| 256 | 254 | data = spriteram[offs + 0]; |
| 257 | 255 | zoomy = (data & 0xfe00) >> 9; |
| r21022 | r21023 | |
| 321 | 319 | flipy = !flipy; |
| 322 | 320 | } |
| 323 | 321 | |
| 324 | | pdrawgfxzoom_transpen(bitmap,cliprect,machine.gfx[0], |
| 322 | pdrawgfxzoom_transpen(bitmap,cliprect,machine().gfx[0], |
| 325 | 323 | code, |
| 326 | 324 | color, |
| 327 | 325 | flipx,flipy, |
| 328 | 326 | curx,cury, |
| 329 | 327 | zx<<12,zy<<12, |
| 330 | | machine.priority_bitmap,primasks[priority],0); |
| 328 | machine().priority_bitmap,primasks[priority],0); |
| 331 | 329 | } |
| 332 | 330 | } |
| 333 | 331 | else if ((zoomx - 1) & 0x20) /* 64x128 sprites, $40000-$5ffff in spritemap rom, OBJB */ |
| r21022 | r21023 | |
| 364 | 362 | flipy = !flipy; |
| 365 | 363 | } |
| 366 | 364 | |
| 367 | | pdrawgfxzoom_transpen(bitmap,cliprect,machine.gfx[2], |
| 365 | pdrawgfxzoom_transpen(bitmap,cliprect,machine().gfx[2], |
| 368 | 366 | code, |
| 369 | 367 | color, |
| 370 | 368 | flipx,flipy, |
| 371 | 369 | curx,cury, |
| 372 | 370 | zx<<12,zy<<12, |
| 373 | | machine.priority_bitmap,primasks[priority],0); |
| 371 | machine().priority_bitmap,primasks[priority],0); |
| 374 | 372 | } |
| 375 | 373 | } |
| 376 | 374 | else if (!((zoomx - 1) & 0x60)) /* 32x128 sprites, $60000-$7ffff in spritemap rom, OBJB */ |
| r21022 | r21023 | |
| 407 | 405 | flipy = !flipy; |
| 408 | 406 | } |
| 409 | 407 | |
| 410 | | pdrawgfxzoom_transpen(bitmap,cliprect,machine.gfx[2], |
| 408 | pdrawgfxzoom_transpen(bitmap,cliprect,machine().gfx[2], |
| 411 | 409 | code, |
| 412 | 410 | color, |
| 413 | 411 | flipx,flipy, |
| 414 | 412 | curx,cury, |
| 415 | 413 | zx<<12,zy<<12, |
| 416 | | machine.priority_bitmap,primasks[priority],0); |
| 414 | machine().priority_bitmap,primasks[priority],0); |
| 417 | 415 | } |
| 418 | 416 | } |
| 419 | 417 | |
| r21022 | r21023 | |
| 424 | 422 | |
| 425 | 423 | |
| 426 | 424 | |
| 427 | | static void bshark_draw_sprites_16x8( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int y_offs ) |
| 425 | void taitoz_state::bshark_draw_sprites_16x8( bitmap_ind16 &bitmap, const rectangle &cliprect, int y_offs ) |
| 428 | 426 | { |
| 429 | | taitoz_state *state = machine.driver_data<taitoz_state>(); |
| 430 | | UINT16 *spritemap = (UINT16 *)state->memregion("user1")->base(); |
| 431 | | UINT16 *spriteram = state->m_spriteram; |
| 427 | UINT16 *spritemap = (UINT16 *)memregion("user1")->base(); |
| 428 | UINT16 *spriteram = m_spriteram; |
| 432 | 429 | int offs, data, tilenum, color, flipx, flipy; |
| 433 | 430 | int x, y, priority, curx, cury; |
| 434 | 431 | int sprites_flipscreen = 0; |
| r21022 | r21023 | |
| 437 | 434 | int bad_chunks; |
| 438 | 435 | static const int primasks[2] = { 0xf0, 0xfc }; |
| 439 | 436 | |
| 440 | | for (offs = state->m_spriteram.bytes() / 2 - 4; offs >= 0; offs -= 4) |
| 437 | for (offs = m_spriteram.bytes() / 2 - 4; offs >= 0; offs -= 4) |
| 441 | 438 | { |
| 442 | 439 | data = spriteram[offs + 0]; |
| 443 | 440 | zoomy = (data & 0x7e00) >> 9; |
| r21022 | r21023 | |
| 504 | 501 | flipy = !flipy; |
| 505 | 502 | } |
| 506 | 503 | |
| 507 | | pdrawgfxzoom_transpen(bitmap,cliprect,machine.gfx[0], |
| 504 | pdrawgfxzoom_transpen(bitmap,cliprect,machine().gfx[0], |
| 508 | 505 | code, |
| 509 | 506 | color, |
| 510 | 507 | flipx,flipy, |
| 511 | 508 | curx,cury, |
| 512 | 509 | zx<<12,zy<<13, |
| 513 | | machine.priority_bitmap,primasks[priority],0); |
| 510 | machine().priority_bitmap,primasks[priority],0); |
| 514 | 511 | } |
| 515 | 512 | |
| 516 | 513 | if (bad_chunks) |
| r21022 | r21023 | |
| 520 | 517 | |
| 521 | 518 | |
| 522 | 519 | |
| 523 | | static void sci_draw_sprites_16x8( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int y_offs ) |
| 520 | void taitoz_state::sci_draw_sprites_16x8( bitmap_ind16 &bitmap, const rectangle &cliprect, int y_offs ) |
| 524 | 521 | { |
| 525 | | taitoz_state *state = machine.driver_data<taitoz_state>(); |
| 526 | | UINT16 *spritemap = (UINT16 *)state->memregion("user1")->base(); |
| 527 | | UINT16 *spriteram = state->m_spriteram; |
| 522 | UINT16 *spritemap = (UINT16 *)memregion("user1")->base(); |
| 523 | UINT16 *spriteram = m_spriteram; |
| 528 | 524 | int offs, start_offs, data, tilenum, color, flipx, flipy; |
| 529 | 525 | int x, y, priority, curx, cury; |
| 530 | 526 | int sprites_flipscreen = 0; |
| r21022 | r21023 | |
| 539 | 535 | // reversing it now only gives us sprite updates on alternate |
| 540 | 536 | // frames. So we probably have to partly buffer spriteram? |
| 541 | 537 | |
| 542 | | start_offs = (state->m_sci_spriteframe & 1) * 0x800; |
| 538 | start_offs = (m_sci_spriteframe & 1) * 0x800; |
| 543 | 539 | start_offs = 0x800 - start_offs; |
| 544 | 540 | |
| 545 | 541 | for (offs = (start_offs + 0x800 - 4); offs >= start_offs; offs -= 4) |
| r21022 | r21023 | |
| 609 | 605 | flipy = !flipy; |
| 610 | 606 | } |
| 611 | 607 | |
| 612 | | pdrawgfxzoom_transpen(bitmap,cliprect,machine.gfx[0], |
| 608 | pdrawgfxzoom_transpen(bitmap,cliprect,machine().gfx[0], |
| 613 | 609 | code, |
| 614 | 610 | color, |
| 615 | 611 | flipx,flipy, |
| 616 | 612 | curx,cury, |
| 617 | 613 | zx<<12,zy<<13, |
| 618 | | machine.priority_bitmap,primasks[priority],0); |
| 614 | machine().priority_bitmap,primasks[priority],0); |
| 619 | 615 | } |
| 620 | 616 | |
| 621 | 617 | if (bad_chunks) |
| r21022 | r21023 | |
| 625 | 621 | |
| 626 | 622 | |
| 627 | 623 | |
| 628 | | static void aquajack_draw_sprites_16x8(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect,int y_offs) |
| 624 | void taitoz_state::aquajack_draw_sprites_16x8(bitmap_ind16 &bitmap,const rectangle &cliprect,int y_offs) |
| 629 | 625 | { |
| 630 | | taitoz_state *state = machine.driver_data<taitoz_state>(); |
| 631 | | UINT16 *spritemap = (UINT16 *)state->memregion("user1")->base(); |
| 632 | | UINT16 *spriteram = state->m_spriteram; |
| 626 | UINT16 *spritemap = (UINT16 *)memregion("user1")->base(); |
| 627 | UINT16 *spriteram = m_spriteram; |
| 633 | 628 | int offs, data, tilenum, color, flipx, flipy; |
| 634 | 629 | int x, y, priority, curx, cury; |
| 635 | 630 | int sprites_flipscreen = 0; |
| r21022 | r21023 | |
| 638 | 633 | int bad_chunks; |
| 639 | 634 | static const int primasks[2] = { 0xf0, 0xfc }; |
| 640 | 635 | |
| 641 | | for (offs = 0; offs < state->m_spriteram.bytes() / 2; offs += 4) |
| 636 | for (offs = 0; offs < m_spriteram.bytes() / 2; offs += 4) |
| 642 | 637 | { |
| 643 | 638 | data = spriteram[offs + 0]; |
| 644 | 639 | zoomy = (data & 0x7e00) >> 9; |
| r21022 | r21023 | |
| 704 | 699 | flipy = !flipy; |
| 705 | 700 | } |
| 706 | 701 | |
| 707 | | pdrawgfxzoom_transpen(bitmap,cliprect,machine.gfx[0], |
| 702 | pdrawgfxzoom_transpen(bitmap,cliprect,machine().gfx[0], |
| 708 | 703 | code, |
| 709 | 704 | color, |
| 710 | 705 | flipx,flipy, |
| 711 | 706 | curx,cury, |
| 712 | 707 | zx<<12,zy<<13, |
| 713 | | machine.priority_bitmap,primasks[priority],0); |
| 708 | machine().priority_bitmap,primasks[priority],0); |
| 714 | 709 | } |
| 715 | 710 | |
| 716 | 711 | if (bad_chunks) |
| r21022 | r21023 | |
| 720 | 715 | |
| 721 | 716 | |
| 722 | 717 | |
| 723 | | static void spacegun_draw_sprites_16x8(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect,int y_offs) |
| 718 | void taitoz_state::spacegun_draw_sprites_16x8(bitmap_ind16 &bitmap,const rectangle &cliprect,int y_offs) |
| 724 | 719 | { |
| 725 | | taitoz_state *state = machine.driver_data<taitoz_state>(); |
| 726 | | UINT16 *spritemap = (UINT16 *)state->memregion("user1")->base(); |
| 727 | | UINT16 *spriteram = state->m_spriteram; |
| 720 | UINT16 *spritemap = (UINT16 *)memregion("user1")->base(); |
| 721 | UINT16 *spriteram = m_spriteram; |
| 728 | 722 | int offs, data, tilenum, color, flipx, flipy; |
| 729 | 723 | int x, y, priority, curx, cury; |
| 730 | 724 | int sprites_flipscreen = 0; |
| r21022 | r21023 | |
| 733 | 727 | int bad_chunks; |
| 734 | 728 | static const int primasks[2] = { 0xf0, 0xfc }; |
| 735 | 729 | |
| 736 | | for (offs = 0; offs < state->m_spriteram.bytes() / 2 - 4; offs += 4) |
| 730 | for (offs = 0; offs < m_spriteram.bytes() / 2 - 4; offs += 4) |
| 737 | 731 | { |
| 738 | 732 | data = spriteram[offs + 0]; |
| 739 | 733 | zoomy = (data & 0xfe00) >> 9; |
| r21022 | r21023 | |
| 799 | 793 | flipy = !flipy; |
| 800 | 794 | } |
| 801 | 795 | |
| 802 | | pdrawgfxzoom_transpen(bitmap,cliprect,machine.gfx[0], |
| 796 | pdrawgfxzoom_transpen(bitmap,cliprect,machine().gfx[0], |
| 803 | 797 | code, |
| 804 | 798 | color, |
| 805 | 799 | flipx,flipy, |
| 806 | 800 | curx,cury, |
| 807 | 801 | zx<<12,zy<<13, |
| 808 | | machine.priority_bitmap,primasks[priority],0); |
| 802 | machine().priority_bitmap,primasks[priority],0); |
| 809 | 803 | } |
| 810 | 804 | |
| 811 | 805 | if (bad_chunks) |
| r21022 | r21023 | |
| 856 | 850 | tc0150rod_draw(m_tc0150rod, bitmap, cliprect, -3, m_road_palbank << 6, 1, 0, 1, 2); // -6 |
| 857 | 851 | tc0100scn_tilemap_draw(m_tc0100scn, bitmap, cliprect, layer[2], 0, 4); |
| 858 | 852 | |
| 859 | | contcirc_draw_sprites_16x8(machine(), bitmap, cliprect, 5); // 7 |
| 853 | contcirc_draw_sprites_16x8(bitmap, cliprect, 5); // 7 |
| 860 | 854 | return 0; |
| 861 | 855 | } |
| 862 | 856 | |
| r21022 | r21023 | |
| 883 | 877 | tc0150rod_draw(m_tc0150rod, bitmap, cliprect, -1, 0xc0, 0, 0, 1, 2); |
| 884 | 878 | tc0100scn_tilemap_draw(m_tc0100scn, bitmap, cliprect, layer[2], 0, 4); |
| 885 | 879 | |
| 886 | | chasehq_draw_sprites_16x16(machine(), bitmap, cliprect, 7); |
| 880 | chasehq_draw_sprites_16x16(bitmap, cliprect, 7); |
| 887 | 881 | return 0; |
| 888 | 882 | } |
| 889 | 883 | |
| r21022 | r21023 | |
| 908 | 902 | tc0150rod_draw(m_tc0150rod, bitmap, cliprect, -1, 0xc0, 0, 1, 1, 2); |
| 909 | 903 | tc0100scn_tilemap_draw(m_tc0100scn, bitmap, cliprect, layer[2], 0, 4); |
| 910 | 904 | |
| 911 | | bshark_draw_sprites_16x8(machine(), bitmap, cliprect, 8); |
| 905 | bshark_draw_sprites_16x8(bitmap, cliprect, 8); |
| 912 | 906 | return 0; |
| 913 | 907 | } |
| 914 | 908 | |
| r21022 | r21023 | |
| 933 | 927 | tc0150rod_draw(m_tc0150rod, bitmap, cliprect, -1, 0xc0, 0, 0, 1, 2); |
| 934 | 928 | tc0100scn_tilemap_draw(m_tc0100scn, bitmap, cliprect, layer[2], 0, 4); |
| 935 | 929 | |
| 936 | | sci_draw_sprites_16x8(machine(), bitmap, cliprect, 6); |
| 930 | sci_draw_sprites_16x8(bitmap, cliprect, 6); |
| 937 | 931 | return 0; |
| 938 | 932 | } |
| 939 | 933 | |
| r21022 | r21023 | |
| 958 | 952 | tc0150rod_draw(m_tc0150rod, bitmap, cliprect, -1, 0, 2, 1, 1, 2); |
| 959 | 953 | tc0100scn_tilemap_draw(m_tc0100scn, bitmap, cliprect, layer[2], 0, 4); |
| 960 | 954 | |
| 961 | | aquajack_draw_sprites_16x8(machine(), bitmap, cliprect, 3); |
| 955 | aquajack_draw_sprites_16x8(bitmap, cliprect, 3); |
| 962 | 956 | return 0; |
| 963 | 957 | } |
| 964 | 958 | |
| r21022 | r21023 | |
| 982 | 976 | tc0100scn_tilemap_draw(m_tc0100scn, bitmap, cliprect, layer[1], 0, 2); |
| 983 | 977 | tc0100scn_tilemap_draw(m_tc0100scn, bitmap, cliprect, layer[2], 0, 4); |
| 984 | 978 | |
| 985 | | spacegun_draw_sprites_16x8(machine(), bitmap, cliprect, 4); |
| 979 | spacegun_draw_sprites_16x8(bitmap, cliprect, 4); |
| 986 | 980 | |
| 987 | 981 | return 0; |
| 988 | 982 | } |
| r21022 | r21023 | |
| 1013 | 1007 | tc0480scp_tilemap_draw(m_tc0480scp, bitmap, cliprect, layer[2], 0, 1); |
| 1014 | 1008 | |
| 1015 | 1009 | tc0150rod_draw(m_tc0150rod, bitmap, cliprect, -1, 0xc0, 0, 0, 1, 2); |
| 1016 | | bshark_draw_sprites_16x8(machine(), bitmap, cliprect, 7); |
| 1010 | bshark_draw_sprites_16x8(bitmap, cliprect, 7); |
| 1017 | 1011 | |
| 1018 | 1012 | /* This layer used for the big numeric displays */ |
| 1019 | 1013 | tc0480scp_tilemap_draw(m_tc0480scp, bitmap, cliprect, layer[3], 0, 4); |
| r21022 | r21023 | |
| 1049 | 1043 | tc0480scp_tilemap_draw(m_tc0480scp, bitmap, cliprect, layer[3], 0, 2); |
| 1050 | 1044 | |
| 1051 | 1045 | tc0150rod_draw(m_tc0150rod, bitmap, cliprect, -1, 0xc0, 0, 0, 1, 2); |
| 1052 | | sci_draw_sprites_16x8(machine(), bitmap, cliprect, 7); |
| 1046 | sci_draw_sprites_16x8(bitmap, cliprect, 7); |
| 1053 | 1047 | |
| 1054 | 1048 | tc0480scp_tilemap_draw(m_tc0480scp, bitmap, cliprect, layer[4], 0, 4); |
| 1055 | 1049 | return 0; |
trunk/src/mame/video/taito_f2.c
| r21022 | r21023 | |
| 26 | 26 | |
| 27 | 27 | /***********************************************************************************/ |
| 28 | 28 | |
| 29 | | static void taitof2_core_vh_start (running_machine &machine, int sprite_type, int hide, int flip_hide ) |
| 29 | void taitof2_state::taitof2_core_vh_start (int sprite_type, int hide, int flip_hide ) |
| 30 | 30 | { |
| 31 | 31 | int i; |
| 32 | | taitof2_state *state = machine.driver_data<taitof2_state>(); |
| 33 | | state->m_sprite_type = sprite_type; |
| 34 | | state->m_hide_pixels = hide; |
| 35 | | state->m_flip_hide_pixels = flip_hide; |
| 32 | m_sprite_type = sprite_type; |
| 33 | m_hide_pixels = hide; |
| 34 | m_flip_hide_pixels = flip_hide; |
| 36 | 35 | |
| 37 | | state->m_spriteram_delayed = auto_alloc_array(machine, UINT16, state->m_spriteram.bytes() / 2); |
| 38 | | state->m_spriteram_buffered = auto_alloc_array(machine, UINT16, state->m_spriteram.bytes() / 2); |
| 39 | | state->m_spritelist = auto_alloc_array(machine, struct f2_tempsprite, 0x400); |
| 36 | m_spriteram_delayed = auto_alloc_array(machine(), UINT16, m_spriteram.bytes() / 2); |
| 37 | m_spriteram_buffered = auto_alloc_array(machine(), UINT16, m_spriteram.bytes() / 2); |
| 38 | m_spritelist = auto_alloc_array(machine(), struct f2_tempsprite, 0x400); |
| 40 | 39 | |
| 41 | 40 | for (i = 0; i < 8; i ++) |
| 42 | 41 | { |
| 43 | | state->m_spritebank_buffered[i] = 0x400 * i; |
| 44 | | state->m_spritebank[i] = state->m_spritebank_buffered[i]; |
| 42 | m_spritebank_buffered[i] = 0x400 * i; |
| 43 | m_spritebank[i] = m_spritebank_buffered[i]; |
| 45 | 44 | } |
| 46 | 45 | |
| 47 | | state->m_sprites_disabled = 1; |
| 48 | | state->m_sprites_active_area = 0; |
| 49 | | state->m_sprites_flipscreen = 0; |
| 46 | m_sprites_disabled = 1; |
| 47 | m_sprites_active_area = 0; |
| 48 | m_sprites_flipscreen = 0; |
| 50 | 49 | |
| 51 | | state->m_sprites_master_scrollx = 0; |
| 52 | | state->m_sprites_master_scrolly = 0; |
| 50 | m_sprites_master_scrollx = 0; |
| 51 | m_sprites_master_scrolly = 0; |
| 53 | 52 | |
| 54 | | state->m_spriteblendmode = 0; |
| 55 | | state->m_prepare_sprites = 0; |
| 53 | m_spriteblendmode = 0; |
| 54 | m_prepare_sprites = 0; |
| 56 | 55 | |
| 57 | | state->m_game = 0; /* means NOT footchmp */ |
| 56 | m_game = 0; /* means NOT footchmp */ |
| 58 | 57 | |
| 59 | | state->save_item(NAME(state->m_spritebank)); |
| 60 | | state->save_item(NAME(state->m_spritebank_buffered)); |
| 61 | | state->save_item(NAME(state->m_sprites_disabled)); |
| 62 | | state->save_item(NAME(state->m_sprites_active_area)); |
| 63 | | state->save_item(NAME(state->m_sprites_flipscreen)); |
| 64 | | state->save_item(NAME(state->m_sprites_master_scrollx)); |
| 65 | | state->save_item(NAME(state->m_sprites_master_scrolly)); |
| 66 | | state->save_item(NAME(state->m_tilepri)); |
| 67 | | state->save_item(NAME(state->m_spritepri)); |
| 68 | | state->save_item(NAME(state->m_spriteblendmode)); |
| 69 | | state->save_item(NAME(state->m_prepare_sprites)); |
| 70 | | state->save_pointer(NAME(state->m_spriteram_delayed), state->m_spriteram.bytes() / 2); |
| 71 | | state->save_pointer(NAME(state->m_spriteram_buffered), state->m_spriteram.bytes() / 2); |
| 58 | save_item(NAME(m_spritebank)); |
| 59 | save_item(NAME(m_spritebank_buffered)); |
| 60 | save_item(NAME(m_sprites_disabled)); |
| 61 | save_item(NAME(m_sprites_active_area)); |
| 62 | save_item(NAME(m_sprites_flipscreen)); |
| 63 | save_item(NAME(m_sprites_master_scrollx)); |
| 64 | save_item(NAME(m_sprites_master_scrolly)); |
| 65 | save_item(NAME(m_tilepri)); |
| 66 | save_item(NAME(m_spritepri)); |
| 67 | save_item(NAME(m_spriteblendmode)); |
| 68 | save_item(NAME(m_prepare_sprites)); |
| 69 | save_pointer(NAME(m_spriteram_delayed), m_spriteram.bytes() / 2); |
| 70 | save_pointer(NAME(m_spriteram_buffered), m_spriteram.bytes() / 2); |
| 72 | 71 | } |
| 73 | 72 | |
| 74 | 73 | /**************************************************************************************/ |
| r21022 | r21023 | |
| 77 | 76 | |
| 78 | 77 | VIDEO_START_MEMBER(taitof2_state,taitof2_default) |
| 79 | 78 | { |
| 80 | | taitof2_core_vh_start(machine(), 0, 0, 0); |
| 79 | taitof2_core_vh_start(0, 0, 0); |
| 81 | 80 | } |
| 82 | 81 | |
| 83 | 82 | VIDEO_START_MEMBER(taitof2_state,taitof2_megab)/* Megab, Liquidk */ |
| 84 | 83 | { |
| 85 | | taitof2_core_vh_start(machine(), 0, 3, 3); |
| 84 | taitof2_core_vh_start(0, 3, 3); |
| 86 | 85 | } |
| 87 | 86 | |
| 88 | 87 | VIDEO_START_MEMBER(taitof2_state,taitof2_quiz)/* Quiz Crayons, Quiz Jinsei */ |
| 89 | 88 | { |
| 90 | | taitof2_core_vh_start(machine(), 3, 3, 3); |
| 89 | taitof2_core_vh_start(3, 3, 3); |
| 91 | 90 | } |
| 92 | 91 | |
| 93 | 92 | VIDEO_START_MEMBER(taitof2_state,taitof2_finalb) |
| 94 | 93 | { |
| 95 | | taitof2_core_vh_start(machine(), 0, 1, 1); |
| 94 | taitof2_core_vh_start(0, 1, 1); |
| 96 | 95 | } |
| 97 | 96 | |
| 98 | 97 | VIDEO_START_MEMBER(taitof2_state,taitof2_ssi) |
| 99 | 98 | { |
| 100 | | taitof2_core_vh_start(machine(), 0, 3, 3); |
| 99 | taitof2_core_vh_start(0, 3, 3); |
| 101 | 100 | } |
| 102 | 101 | |
| 103 | 102 | VIDEO_START_MEMBER(taitof2_state,taitof2_growl) |
| 104 | 103 | { |
| 105 | | taitof2_core_vh_start(machine(), 0, 3, 3); |
| 104 | taitof2_core_vh_start(0, 3, 3); |
| 106 | 105 | } |
| 107 | 106 | |
| 108 | 107 | VIDEO_START_MEMBER(taitof2_state,taitof2_ninjak) |
| 109 | 108 | { |
| 110 | | taitof2_core_vh_start(machine(), 0, 0, 0); |
| 109 | taitof2_core_vh_start(0, 0, 0); |
| 111 | 110 | } |
| 112 | 111 | |
| 113 | 112 | VIDEO_START_MEMBER(taitof2_state,taitof2_qzchikyu) |
| 114 | 113 | { |
| 115 | | taitof2_core_vh_start(machine(), 0, 0, 4); |
| 114 | taitof2_core_vh_start(0, 0, 4); |
| 116 | 115 | } |
| 117 | 116 | |
| 118 | 117 | VIDEO_START_MEMBER(taitof2_state,taitof2_solfigtr) |
| 119 | 118 | { |
| 120 | | taitof2_core_vh_start(machine(), 0, 3, -3); |
| 119 | taitof2_core_vh_start(0, 3, -3); |
| 121 | 120 | } |
| 122 | 121 | |
| 123 | 122 | VIDEO_START_MEMBER(taitof2_state,taitof2_koshien) |
| 124 | 123 | { |
| 125 | | taitof2_core_vh_start(machine(), 0, 1, - 1); |
| 124 | taitof2_core_vh_start(0, 1, - 1); |
| 126 | 125 | } |
| 127 | 126 | |
| 128 | 127 | VIDEO_START_MEMBER(taitof2_state,taitof2_gunfront) |
| 129 | 128 | { |
| 130 | | taitof2_core_vh_start(machine(), 0, 3, 3); |
| 129 | taitof2_core_vh_start(0, 3, 3); |
| 131 | 130 | } |
| 132 | 131 | |
| 133 | 132 | VIDEO_START_MEMBER(taitof2_state,taitof2_thundfox) |
| 134 | 133 | { |
| 135 | | taitof2_core_vh_start(machine(), 0, 3, -3); |
| 134 | taitof2_core_vh_start(0, 3, -3); |
| 136 | 135 | } |
| 137 | 136 | |
| 138 | 137 | VIDEO_START_MEMBER(taitof2_state,taitof2_mjnquest) |
| 139 | 138 | { |
| 140 | | taitof2_core_vh_start(machine(), 0, 0, 0); |
| 139 | taitof2_core_vh_start(0, 0, 0); |
| 141 | 140 | |
| 142 | 141 | tc0100scn_set_bg_tilemask(m_tc0100scn, 0x7fff); |
| 143 | 142 | } |
| 144 | 143 | |
| 145 | 144 | VIDEO_START_MEMBER(taitof2_state,taitof2_footchmp) |
| 146 | 145 | { |
| 147 | | taitof2_core_vh_start(machine(), 0, 3, 3); |
| 146 | taitof2_core_vh_start(0, 3, 3); |
| 148 | 147 | |
| 149 | 148 | m_game = FOOTCHMP; |
| 150 | 149 | } |
| 151 | 150 | |
| 152 | 151 | VIDEO_START_MEMBER(taitof2_state,taitof2_hthero) |
| 153 | 152 | { |
| 154 | | taitof2_core_vh_start(machine(), 0, 3, 3); |
| 153 | taitof2_core_vh_start(0, 3, 3); |
| 155 | 154 | |
| 156 | 155 | m_game = FOOTCHMP; |
| 157 | 156 | } |
| 158 | 157 | |
| 159 | 158 | VIDEO_START_MEMBER(taitof2_state,taitof2_deadconx) |
| 160 | 159 | { |
| 161 | | taitof2_core_vh_start(machine(), 0, 3, 3); |
| 160 | taitof2_core_vh_start(0, 3, 3); |
| 162 | 161 | } |
| 163 | 162 | |
| 164 | 163 | VIDEO_START_MEMBER(taitof2_state,taitof2_deadconxj) |
| 165 | 164 | { |
| 166 | | taitof2_core_vh_start(machine(), 0, 3, 3); |
| 165 | taitof2_core_vh_start(0, 3, 3); |
| 167 | 166 | } |
| 168 | 167 | |
| 169 | 168 | VIDEO_START_MEMBER(taitof2_state,taitof2_metalb) |
| 170 | 169 | { |
| 171 | | taitof2_core_vh_start(machine(), 0, 3, 3); |
| 170 | taitof2_core_vh_start(0, 3, 3); |
| 172 | 171 | } |
| 173 | 172 | |
| 174 | 173 | VIDEO_START_MEMBER(taitof2_state,taitof2_yuyugogo) |
| 175 | 174 | { |
| 176 | | taitof2_core_vh_start(machine(), 1, 3, 3); |
| 175 | taitof2_core_vh_start(1, 3, 3); |
| 177 | 176 | } |
| 178 | 177 | |
| 179 | 178 | VIDEO_START_MEMBER(taitof2_state,taitof2_yesnoj) |
| 180 | 179 | { |
| 181 | | taitof2_core_vh_start(machine(), 0, 3, 3); |
| 180 | taitof2_core_vh_start(0, 3, 3); |
| 182 | 181 | } |
| 183 | 182 | |
| 184 | 183 | VIDEO_START_MEMBER(taitof2_state,taitof2_dinorex) |
| 185 | 184 | { |
| 186 | | taitof2_core_vh_start(machine(), 3, 3, 3); |
| 185 | taitof2_core_vh_start(3, 3, 3); |
| 187 | 186 | } |
| 188 | 187 | |
| 189 | 188 | VIDEO_START_MEMBER(taitof2_state,taitof2_dondokod)/* dondokod, cameltry */ |
| 190 | 189 | { |
| 191 | 190 | m_pivot_xdisp = -16; |
| 192 | 191 | m_pivot_ydisp = 0; |
| 193 | | taitof2_core_vh_start(machine(), 0, 3, 3); |
| 192 | taitof2_core_vh_start(0, 3, 3); |
| 194 | 193 | } |
| 195 | 194 | |
| 196 | 195 | VIDEO_START_MEMBER(taitof2_state,taitof2_pulirula) |
| 197 | 196 | { |
| 198 | 197 | m_pivot_xdisp = -10; /* alignment seems correct (see level 2, falling */ |
| 199 | 198 | m_pivot_ydisp = 16; /* block of ice after armour man) */ |
| 200 | | taitof2_core_vh_start(machine(), 2, 3, 3); |
| 199 | taitof2_core_vh_start(2, 3, 3); |
| 201 | 200 | } |
| 202 | 201 | |
| 203 | 202 | VIDEO_START_MEMBER(taitof2_state,taitof2_driftout) |
| 204 | 203 | { |
| 205 | 204 | m_pivot_xdisp = -16; |
| 206 | 205 | m_pivot_ydisp = 16; |
| 207 | | taitof2_core_vh_start(machine(), 0, 3, 3); |
| 206 | taitof2_core_vh_start(0, 3, 3); |
| 208 | 207 | } |
| 209 | 208 | |
| 210 | 209 | |
| r21022 | r21023 | |
| 271 | 270 | m_spritebank_buffered[7] = m_spritebank_buffered[6] + 0x400; |
| 272 | 271 | } |
| 273 | 272 | |
| 274 | | static void taito_f2_tc360_spritemixdraw( running_machine &machine, bitmap_ind16 &dest_bmp, const rectangle &clip, gfx_element *gfx, |
| 273 | void taitof2_state::taito_f2_tc360_spritemixdraw( bitmap_ind16 &dest_bmp, const rectangle &clip, gfx_element *gfx, |
| 275 | 274 | UINT32 code, UINT32 color, int flipx, int flipy, int sx, int sy, int scalex, int scaley ) |
| 276 | 275 | { |
| 277 | | taitof2_state *state = machine.driver_data<taitof2_state>(); |
| 278 | 276 | int pal_base = gfx->colorbase() + gfx->granularity() * (color % gfx->colors()); |
| 279 | 277 | const UINT8 *source_base = gfx->get_data(code % gfx->elements()); |
| 280 | 278 | bitmap_ind8 &priority_bitmap = gfx->machine().priority_bitmap; |
| r21022 | r21023 | |
| 360 | 358 | UINT8 tilemap_priority = 0, sprite_priority = 0; |
| 361 | 359 | |
| 362 | 360 | // Get tilemap priority (0 - 0xf) for this destination pixel |
| 363 | | if (pri[x] & 0x10) tilemap_priority = state->m_tilepri[4]; |
| 364 | | else if (pri[x] & 0x8) tilemap_priority = state->m_tilepri[3]; |
| 365 | | else if (pri[x] & 0x4) tilemap_priority = state->m_tilepri[2]; |
| 366 | | else if (pri[x] & 0x2) tilemap_priority = state->m_tilepri[1]; |
| 367 | | else if (pri[x] & 0x1) tilemap_priority = state->m_tilepri[0]; |
| 361 | if (pri[x] & 0x10) tilemap_priority = m_tilepri[4]; |
| 362 | else if (pri[x] & 0x8) tilemap_priority = m_tilepri[3]; |
| 363 | else if (pri[x] & 0x4) tilemap_priority = m_tilepri[2]; |
| 364 | else if (pri[x] & 0x2) tilemap_priority = m_tilepri[1]; |
| 365 | else if (pri[x] & 0x1) tilemap_priority = m_tilepri[0]; |
| 368 | 366 | |
| 369 | 367 | // Get sprite priority (0 - 0xf) for this source pixel |
| 370 | 368 | if ((color & 0xc0) == 0xc0) |
| 371 | | sprite_priority = state->m_spritepri[3]; |
| 369 | sprite_priority = m_spritepri[3]; |
| 372 | 370 | else if ((color & 0xc0) == 0x80) |
| 373 | | sprite_priority = state->m_spritepri[2]; |
| 371 | sprite_priority = m_spritepri[2]; |
| 374 | 372 | else if ((color & 0xc0) == 0x40) |
| 375 | | sprite_priority = state->m_spritepri[1]; |
| 373 | sprite_priority = m_spritepri[1]; |
| 376 | 374 | else if ((color & 0xc0) == 0x00) |
| 377 | | sprite_priority = state->m_spritepri[0]; |
| 375 | sprite_priority = m_spritepri[0]; |
| 378 | 376 | |
| 379 | 377 | // Blend mode 1 - Sprite under tilemap, use sprite palette with tilemap data |
| 380 | | if ((state->m_spriteblendmode & 0xc0) == 0xc0 && sprite_priority == (tilemap_priority - 1)) |
| 378 | if ((m_spriteblendmode & 0xc0) == 0xc0 && sprite_priority == (tilemap_priority - 1)) |
| 381 | 379 | { |
| 382 | 380 | dest[x] = ((pal_base + c) & 0xfff0) | (dest[x] & 0xf); |
| 383 | 381 | } |
| 384 | 382 | // Blend mode 1 - Sprite over tilemap, use sprite data with tilemap palette |
| 385 | | else if ((state->m_spriteblendmode & 0xc0) == 0xc0 && sprite_priority == (tilemap_priority + 1)) |
| 383 | else if ((m_spriteblendmode & 0xc0) == 0xc0 && sprite_priority == (tilemap_priority + 1)) |
| 386 | 384 | { |
| 387 | 385 | if (dest[x] & 0xf) |
| 388 | 386 | dest[x] = (dest[x] & 0xfff0) | ((pal_base + c) & 0xf); |
| r21022 | r21023 | |
| 390 | 388 | dest[x] = pal_base + c; |
| 391 | 389 | } |
| 392 | 390 | // Blend mode 2 - Sprite under tilemap, use sprite data with tilemap palette |
| 393 | | else if ((state->m_spriteblendmode & 0xc0) == 0x80 && sprite_priority == (tilemap_priority - 1)) |
| 391 | else if ((m_spriteblendmode & 0xc0) == 0x80 && sprite_priority == (tilemap_priority - 1)) |
| 394 | 392 | { |
| 395 | 393 | dest[x] = (dest[x] & 0xffef); |
| 396 | 394 | } |
| 397 | 395 | // Blend mode 2 - Sprite over tilemap, alternate sprite palette, confirmed in Pulirula level 2 |
| 398 | | else if ((state->m_spriteblendmode & 0xc0) == 0x80 && sprite_priority == (tilemap_priority + 1)) |
| 396 | else if ((m_spriteblendmode & 0xc0) == 0x80 && sprite_priority == (tilemap_priority + 1)) |
| 399 | 397 | { |
| 400 | 398 | dest[x] = ((pal_base + c) & 0xffef); // Pulirula level 2, Liquid Kids attract mode |
| 401 | 399 | } |
| r21022 | r21023 | |
| 417 | 415 | } |
| 418 | 416 | } |
| 419 | 417 | |
| 420 | | static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int *primasks, int uses_tc360_mixer ) |
| 418 | void taitof2_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect, int *primasks, int uses_tc360_mixer ) |
| 421 | 419 | { |
| 422 | 420 | /* |
| 423 | 421 | Sprite format: |
| r21022 | r21023 | |
| 476 | 474 | non zoom parts. |
| 477 | 475 | |
| 478 | 476 | */ |
| 479 | | taitof2_state *state = machine.driver_data<taitof2_state>(); |
| 480 | 477 | int i, x, y, off, extoffs; |
| 481 | 478 | int code, color, spritedata, spritecont, flipx, flipy; |
| 482 | 479 | int xcurrent, ycurrent, big_sprite = 0; |
| r21022 | r21023 | |
| 489 | 486 | |
| 490 | 487 | /* pdrawgfx() needs us to draw sprites front to back, so we have to build a list |
| 491 | 488 | while processing sprite ram and then draw them all at the end */ |
| 492 | | struct f2_tempsprite *sprite_ptr = state->m_spritelist; |
| 489 | struct f2_tempsprite *sprite_ptr = m_spritelist; |
| 493 | 490 | |
| 494 | 491 | /* must remember enable status from last frame because driftout fails to |
| 495 | 492 | reactivate them from a certain point onwards. */ |
| 496 | | int disabled = state->m_sprites_disabled; |
| 493 | int disabled = m_sprites_disabled; |
| 497 | 494 | |
| 498 | 495 | /* must remember master scroll from previous frame because driftout |
| 499 | 496 | sometimes doesn't set it. */ |
| 500 | | int master_scrollx = state->m_sprites_master_scrollx; |
| 501 | | int master_scrolly = state->m_sprites_master_scrolly; |
| 497 | int master_scrollx = m_sprites_master_scrollx; |
| 498 | int master_scrolly = m_sprites_master_scrolly; |
| 502 | 499 | |
| 503 | 500 | /* must also remember the sprite bank from previous frame. */ |
| 504 | | int area = state->m_sprites_active_area; |
| 501 | int area = m_sprites_active_area; |
| 505 | 502 | |
| 506 | 503 | scroll1x = 0; |
| 507 | 504 | scroll1y = 0; |
| r21022 | r21023 | |
| 509 | 506 | xcurrent = ycurrent = 0; |
| 510 | 507 | color = 0; |
| 511 | 508 | |
| 512 | | f2_x_offset = state->m_hide_pixels; /* Get rid of 0-3 unwanted pixels on edge of screen. */ |
| 513 | | if (state->m_sprites_flipscreen) |
| 514 | | f2_x_offset = -state->m_flip_hide_pixels; // was -f2_x_offset |
| 509 | f2_x_offset = m_hide_pixels; /* Get rid of 0-3 unwanted pixels on edge of screen. */ |
| 510 | if (m_sprites_flipscreen) |
| 511 | f2_x_offset = -m_flip_hide_pixels; // was -f2_x_offset |
| 515 | 512 | |
| 516 | 513 | /* safety check to avoid getting stuck in bank 2 for games using only one bank */ |
| 517 | | if (area == 0x8000 && state->m_spriteram_buffered[(0x8000 + 6) / 2] == 0 && state->m_spriteram_buffered[(0x8000 + 10) / 2] == 0) |
| 514 | if (area == 0x8000 && m_spriteram_buffered[(0x8000 + 6) / 2] == 0 && m_spriteram_buffered[(0x8000 + 10) / 2] == 0) |
| 518 | 515 | area = 0; |
| 519 | 516 | |
| 520 | 517 | for (off = 0; off < 0x4000; off += 16) |
| r21022 | r21023 | |
| 522 | 519 | /* sprites_active_area may change during processing */ |
| 523 | 520 | int offs = off + area; |
| 524 | 521 | |
| 525 | | if (state->m_spriteram_buffered[(offs + 6) / 2] & 0x8000) |
| 522 | if (m_spriteram_buffered[(offs + 6) / 2] & 0x8000) |
| 526 | 523 | { |
| 527 | | disabled = state->m_spriteram_buffered[(offs + 10) / 2] & 0x1000; |
| 528 | | state->m_sprites_flipscreen = state->m_spriteram_buffered[(offs + 10) / 2] & 0x2000; |
| 524 | disabled = m_spriteram_buffered[(offs + 10) / 2] & 0x1000; |
| 525 | m_sprites_flipscreen = m_spriteram_buffered[(offs + 10) / 2] & 0x2000; |
| 529 | 526 | |
| 530 | 527 | /* Get rid of 0-3 unwanted pixels on edge of screen. */ |
| 531 | | f2_x_offset = state->m_hide_pixels; |
| 532 | | if (state->m_sprites_flipscreen) |
| 533 | | f2_x_offset = -state->m_flip_hide_pixels; // was -f2_x_offset |
| 528 | f2_x_offset = m_hide_pixels; |
| 529 | if (m_sprites_flipscreen) |
| 530 | f2_x_offset = -m_flip_hide_pixels; // was -f2_x_offset |
| 534 | 531 | |
| 535 | | if (state->m_game == FOOTCHMP) |
| 536 | | area = 0x8000 * (state->m_spriteram_buffered[(offs + 6) / 2] & 0x0001); |
| 532 | if (m_game == FOOTCHMP) |
| 533 | area = 0x8000 * (m_spriteram_buffered[(offs + 6) / 2] & 0x0001); |
| 537 | 534 | else |
| 538 | | area = 0x8000 * (state->m_spriteram_buffered[(offs + 10) / 2] & 0x0001); |
| 535 | area = 0x8000 * (m_spriteram_buffered[(offs + 10) / 2] & 0x0001); |
| 539 | 536 | continue; |
| 540 | 537 | } |
| 541 | 538 | |
| 542 | 539 | //popmessage("%04x",area); |
| 543 | 540 | |
| 544 | 541 | /* check for extra scroll offset */ |
| 545 | | if ((state->m_spriteram_buffered[(offs + 4) / 2] & 0xf000) == 0xa000) |
| 542 | if ((m_spriteram_buffered[(offs + 4) / 2] & 0xf000) == 0xa000) |
| 546 | 543 | { |
| 547 | | master_scrollx = state->m_spriteram_buffered[(offs + 4) / 2] & 0xfff; |
| 544 | master_scrollx = m_spriteram_buffered[(offs + 4) / 2] & 0xfff; |
| 548 | 545 | if (master_scrollx >= 0x800) |
| 549 | 546 | master_scrollx -= 0x1000; /* signed value */ |
| 550 | 547 | |
| 551 | | master_scrolly = state->m_spriteram_buffered[(offs + 6) / 2] & 0xfff; |
| 548 | master_scrolly = m_spriteram_buffered[(offs + 6) / 2] & 0xfff; |
| 552 | 549 | if (master_scrolly >= 0x800) |
| 553 | 550 | master_scrolly -= 0x1000; /* signed value */ |
| 554 | 551 | } |
| 555 | 552 | |
| 556 | | if ((state->m_spriteram_buffered[(offs + 4) / 2] & 0xf000) == 0x5000) |
| 553 | if ((m_spriteram_buffered[(offs + 4) / 2] & 0xf000) == 0x5000) |
| 557 | 554 | { |
| 558 | | scroll1x = state->m_spriteram_buffered[(offs + 4) / 2] & 0xfff; |
| 555 | scroll1x = m_spriteram_buffered[(offs + 4) / 2] & 0xfff; |
| 559 | 556 | if (scroll1x >= 0x800) |
| 560 | 557 | scroll1x -= 0x1000; /* signed value */ |
| 561 | 558 | |
| 562 | | scroll1y = state->m_spriteram_buffered[(offs + 6) / 2] & 0xfff; |
| 559 | scroll1y = m_spriteram_buffered[(offs + 6) / 2] & 0xfff; |
| 563 | 560 | if (scroll1y >= 0x800) |
| 564 | 561 | scroll1y -= 0x1000; /* signed value */ |
| 565 | 562 | } |
| r21022 | r21023 | |
| 567 | 564 | if (disabled) |
| 568 | 565 | continue; |
| 569 | 566 | |
| 570 | | spritedata = state->m_spriteram_buffered[(offs + 8) / 2]; |
| 567 | spritedata = m_spriteram_buffered[(offs + 8) / 2]; |
| 571 | 568 | |
| 572 | 569 | spritecont = (spritedata & 0xff00) >> 8; |
| 573 | 570 | |
| r21022 | r21023 | |
| 575 | 572 | { |
| 576 | 573 | if (big_sprite == 0) /* are we starting a big sprite ? */ |
| 577 | 574 | { |
| 578 | | xlatch = state->m_spriteram_buffered[(offs + 4) / 2] & 0xfff; |
| 579 | | ylatch = state->m_spriteram_buffered[(offs + 6) / 2] & 0xfff; |
| 575 | xlatch = m_spriteram_buffered[(offs + 4) / 2] & 0xfff; |
| 576 | ylatch = m_spriteram_buffered[(offs + 6) / 2] & 0xfff; |
| 580 | 577 | x_no = 0; |
| 581 | 578 | y_no = 0; |
| 582 | | zoomword = state->m_spriteram_buffered[(offs + 2) / 2]; |
| 579 | zoomword = m_spriteram_buffered[(offs + 2) / 2]; |
| 583 | 580 | zoomylatch = (zoomword >> 8) & 0xff; |
| 584 | 581 | zoomxlatch = (zoomword >> 0) & 0xff; |
| 585 | 582 | big_sprite = 1; /* we have started a new big sprite */ |
| r21022 | r21023 | |
| 600 | 597 | // of anything. |
| 601 | 598 | if (big_sprite == 0 || (spritecont & 0xf0) == 0) |
| 602 | 599 | { |
| 603 | | x = state->m_spriteram_buffered[(offs + 4) / 2]; |
| 600 | x = m_spriteram_buffered[(offs + 4) / 2]; |
| 604 | 601 | |
| 605 | 602 | // Some absolute x values deduced here are 1 too high (scenes when you get |
| 606 | 603 | // home run in Koshien, and may also relate to BG layer woods and stuff as you |
| r21022 | r21023 | |
| 623 | 620 | scrolly = scroll1y + master_scrolly; |
| 624 | 621 | } |
| 625 | 622 | x &= 0xfff; |
| 626 | | y = state->m_spriteram_buffered[(offs + 6) / 2] & 0xfff; |
| 623 | y = m_spriteram_buffered[(offs + 6) / 2] & 0xfff; |
| 627 | 624 | |
| 628 | 625 | xcurrent = x; |
| 629 | 626 | ycurrent = y; |
| r21022 | r21023 | |
| 675 | 672 | } |
| 676 | 673 | else |
| 677 | 674 | { |
| 678 | | zoomword = state->m_spriteram_buffered[(offs + 2) / 2]; |
| 675 | zoomword = m_spriteram_buffered[(offs + 2) / 2]; |
| 679 | 676 | zoomy = (zoomword >> 8) & 0xff; |
| 680 | 677 | zoomx = (zoomword >> 0) & 0xff; |
| 681 | 678 | zx = (0x100 - zoomx) / 16; |
| r21022 | r21023 | |
| 693 | 690 | /* spriteram[0x4000-7fff] has no corresponding extension area */ |
| 694 | 691 | if (extoffs >= 0x8000) extoffs -= 0x4000; |
| 695 | 692 | |
| 696 | | if (state->m_sprite_type == 0) |
| 693 | if (m_sprite_type == 0) |
| 697 | 694 | { |
| 698 | | code = state->m_spriteram_buffered[(offs) / 2] & 0x1fff; |
| 695 | code = m_spriteram_buffered[(offs) / 2] & 0x1fff; |
| 699 | 696 | i = (code & 0x1c00) >> 10; |
| 700 | | code = state->m_spritebank[i] + (code & 0x3ff); |
| 697 | code = m_spritebank[i] + (code & 0x3ff); |
| 701 | 698 | } |
| 702 | 699 | |
| 703 | | if (state->m_sprite_type == 1) /* Yuyugogo */ |
| 700 | if (m_sprite_type == 1) /* Yuyugogo */ |
| 704 | 701 | { |
| 705 | | code = state->m_spriteram_buffered[(offs) / 2] & 0x3ff; |
| 706 | | i = (state->m_sprite_extension[(extoffs >> 4)] & 0x3f ) << 10; |
| 702 | code = m_spriteram_buffered[(offs) / 2] & 0x3ff; |
| 703 | i = (m_sprite_extension[(extoffs >> 4)] & 0x3f ) << 10; |
| 707 | 704 | code = (i | code); |
| 708 | 705 | } |
| 709 | 706 | |
| 710 | | if (state->m_sprite_type == 2) /* Pulirula */ |
| 707 | if (m_sprite_type == 2) /* Pulirula */ |
| 711 | 708 | { |
| 712 | | code = state->m_spriteram_buffered[(offs) / 2] & 0xff; |
| 713 | | i = (state->m_sprite_extension[(extoffs >> 4)] & 0xff00 ); |
| 709 | code = m_spriteram_buffered[(offs) / 2] & 0xff; |
| 710 | i = (m_sprite_extension[(extoffs >> 4)] & 0xff00 ); |
| 714 | 711 | code = (i | code); |
| 715 | 712 | } |
| 716 | 713 | |
| 717 | | if (state->m_sprite_type == 3) /* Dinorex and a few quizzes */ |
| 714 | if (m_sprite_type == 3) /* Dinorex and a few quizzes */ |
| 718 | 715 | { |
| 719 | | code = state->m_spriteram_buffered[(offs) / 2] & 0xff; |
| 720 | | i = (state->m_sprite_extension[(extoffs >> 4)] & 0xff ) << 8; |
| 716 | code = m_spriteram_buffered[(offs) / 2] & 0xff; |
| 717 | i = (m_sprite_extension[(extoffs >> 4)] & 0xff ) << 8; |
| 721 | 718 | code = (i | code); |
| 722 | 719 | } |
| 723 | 720 | |
| r21022 | r21023 | |
| 732 | 729 | cury = (y + scrolly) & 0xfff; |
| 733 | 730 | if (cury >= 0x800) cury -= 0x1000; /* treat it as signed */ |
| 734 | 731 | |
| 735 | | if (state->m_sprites_flipscreen) |
| 732 | if (m_sprites_flipscreen) |
| 736 | 733 | { |
| 737 | 734 | /* -zx/y is there to fix zoomed sprite coords in screenflip. |
| 738 | 735 | drawgfxzoom does not know to draw from flip-side of sprites when |
| r21022 | r21023 | |
| 747 | 744 | { |
| 748 | 745 | sprite_ptr->code = code; |
| 749 | 746 | sprite_ptr->color = color; |
| 750 | | if (machine.gfx[0]->granularity() == 64) /* Final Blow is 6-bit deep */ |
| 747 | if (machine().gfx[0]->granularity() == 64) /* Final Blow is 6-bit deep */ |
| 751 | 748 | sprite_ptr->color /= 4; |
| 752 | 749 | sprite_ptr->flipx = flipx; |
| 753 | 750 | sprite_ptr->flipy = flipy; |
| r21022 | r21023 | |
| 765 | 762 | } |
| 766 | 763 | else |
| 767 | 764 | { |
| 768 | | drawgfxzoom_transpen(bitmap,cliprect,machine.gfx[0], |
| 765 | drawgfxzoom_transpen(bitmap,cliprect,machine().gfx[0], |
| 769 | 766 | sprite_ptr->code, |
| 770 | 767 | sprite_ptr->color, |
| 771 | 768 | sprite_ptr->flipx,sprite_ptr->flipy, |
| r21022 | r21023 | |
| 777 | 774 | |
| 778 | 775 | |
| 779 | 776 | /* this happens only if primsks != NULL */ |
| 780 | | while (sprite_ptr != state->m_spritelist) |
| 777 | while (sprite_ptr != m_spritelist) |
| 781 | 778 | { |
| 782 | 779 | sprite_ptr--; |
| 783 | 780 | |
| 784 | 781 | if (!uses_tc360_mixer) |
| 785 | | pdrawgfxzoom_transpen(bitmap,cliprect,machine.gfx[0], |
| 782 | pdrawgfxzoom_transpen(bitmap,cliprect,machine().gfx[0], |
| 786 | 783 | sprite_ptr->code, |
| 787 | 784 | sprite_ptr->color, |
| 788 | 785 | sprite_ptr->flipx,sprite_ptr->flipy, |
| 789 | 786 | sprite_ptr->x,sprite_ptr->y, |
| 790 | 787 | sprite_ptr->zoomx,sprite_ptr->zoomy, |
| 791 | | machine.priority_bitmap,sprite_ptr->primask,0); |
| 788 | machine().priority_bitmap,sprite_ptr->primask,0); |
| 792 | 789 | else |
| 793 | | taito_f2_tc360_spritemixdraw(machine, bitmap,cliprect,machine.gfx[0], |
| 790 | taito_f2_tc360_spritemixdraw(bitmap,cliprect,machine().gfx[0], |
| 794 | 791 | sprite_ptr->code, |
| 795 | 792 | sprite_ptr->color, |
| 796 | 793 | sprite_ptr->flipx,sprite_ptr->flipy, |
| r21022 | r21023 | |
| 800 | 797 | } |
| 801 | 798 | |
| 802 | 799 | |
| 803 | | static void update_spritebanks( running_machine &machine ) |
| 800 | void taitof2_state::update_spritebanks( ) |
| 804 | 801 | { |
| 805 | | taitof2_state *state = machine.driver_data<taitof2_state>(); |
| 806 | 802 | int i; |
| 807 | 803 | #if 1 |
| 808 | 804 | for (i = 0; i < 8; i ++) |
| 809 | 805 | { |
| 810 | | state->m_spritebank[i] = state->m_spritebank_buffered[i]; |
| 806 | m_spritebank[i] = m_spritebank_buffered[i]; |
| 811 | 807 | } |
| 812 | 808 | #else |
| 813 | 809 | /* this makes footchmp blobbing worse! */ |
| 814 | 810 | for (i = 0; i < 8; i ++) |
| 815 | 811 | { |
| 816 | | state->m_spritebank[i] = state->m_spritebank_eof[i]; |
| 817 | | state->m_spritebank_eof[i] = state->m_spritebank_buffered[i]; |
| 812 | m_spritebank[i] = m_spritebank_eof[i]; |
| 813 | m_spritebank_eof[i] = m_spritebank_buffered[i]; |
| 818 | 814 | } |
| 819 | 815 | #endif |
| 820 | 816 | } |
| 821 | 817 | |
| 822 | | static void taitof2_handle_sprite_buffering( running_machine &machine ) |
| 818 | void taitof2_state::taitof2_handle_sprite_buffering( ) |
| 823 | 819 | { |
| 824 | | taitof2_state *state = machine.driver_data<taitof2_state>(); |
| 825 | 820 | |
| 826 | | if (state->m_prepare_sprites) /* no buffering */ |
| 821 | if (m_prepare_sprites) /* no buffering */ |
| 827 | 822 | { |
| 828 | | memcpy(state->m_spriteram_buffered, state->m_spriteram, state->m_spriteram.bytes()); |
| 829 | | state->m_prepare_sprites = 0; |
| 823 | memcpy(m_spriteram_buffered, m_spriteram, m_spriteram.bytes()); |
| 824 | m_prepare_sprites = 0; |
| 830 | 825 | } |
| 831 | 826 | } |
| 832 | 827 | |
| 833 | | static void taitof2_update_sprites_active_area( running_machine &machine ) |
| 828 | void taitof2_state::taitof2_update_sprites_active_area( ) |
| 834 | 829 | { |
| 835 | | taitof2_state *state = machine.driver_data<taitof2_state>(); |
| 836 | 830 | int off; |
| 837 | 831 | |
| 838 | | update_spritebanks(machine); |
| 832 | update_spritebanks(); |
| 839 | 833 | |
| 840 | 834 | /* if the frame was skipped, we'll have to do the buffering now */ |
| 841 | | taitof2_handle_sprite_buffering(machine); |
| 835 | taitof2_handle_sprite_buffering(); |
| 842 | 836 | |
| 843 | 837 | /* safety check to avoid getting stuck in bank 2 for games using only one bank */ |
| 844 | | if (state->m_sprites_active_area == 0x8000 && |
| 845 | | state->m_spriteram_buffered[(0x8000 + 6) / 2] == 0 && |
| 846 | | state->m_spriteram_buffered[(0x8000 + 10) / 2] == 0) |
| 847 | | state->m_sprites_active_area = 0; |
| 838 | if (m_sprites_active_area == 0x8000 && |
| 839 | m_spriteram_buffered[(0x8000 + 6) / 2] == 0 && |
| 840 | m_spriteram_buffered[(0x8000 + 10) / 2] == 0) |
| 841 | m_sprites_active_area = 0; |
| 848 | 842 | |
| 849 | 843 | for (off = 0; off < 0x4000; off += 16) |
| 850 | 844 | { |
| 851 | 845 | /* sprites_active_area may change during processing */ |
| 852 | | int offs = off + state->m_sprites_active_area; |
| 846 | int offs = off + m_sprites_active_area; |
| 853 | 847 | |
| 854 | | if (state->m_spriteram_buffered[(offs + 6) / 2] & 0x8000) |
| 848 | if (m_spriteram_buffered[(offs + 6) / 2] & 0x8000) |
| 855 | 849 | { |
| 856 | | state->m_sprites_disabled = state->m_spriteram_buffered[(offs + 10) / 2] & 0x1000; |
| 857 | | if (state->m_game == FOOTCHMP) |
| 858 | | state->m_sprites_active_area = 0x8000 * (state->m_spriteram_buffered[(offs + 6) / 2] & 0x0001); |
| 850 | m_sprites_disabled = m_spriteram_buffered[(offs + 10) / 2] & 0x1000; |
| 851 | if (m_game == FOOTCHMP) |
| 852 | m_sprites_active_area = 0x8000 * (m_spriteram_buffered[(offs + 6) / 2] & 0x0001); |
| 859 | 853 | else |
| 860 | | state->m_sprites_active_area = 0x8000 * (state->m_spriteram_buffered[(offs + 10) / 2] & 0x0001); |
| 854 | m_sprites_active_area = 0x8000 * (m_spriteram_buffered[(offs + 10) / 2] & 0x0001); |
| 861 | 855 | continue; |
| 862 | 856 | } |
| 863 | 857 | |
| 864 | 858 | /* check for extra scroll offset */ |
| 865 | | if ((state->m_spriteram_buffered[(offs + 4) / 2] & 0xf000) == 0xa000) |
| 859 | if ((m_spriteram_buffered[(offs + 4) / 2] & 0xf000) == 0xa000) |
| 866 | 860 | { |
| 867 | | state->m_sprites_master_scrollx = state->m_spriteram_buffered[(offs + 4) / 2] & 0xfff; |
| 868 | | if (state->m_sprites_master_scrollx >= 0x800) |
| 869 | | state->m_sprites_master_scrollx -= 0x1000; /* signed value */ |
| 861 | m_sprites_master_scrollx = m_spriteram_buffered[(offs + 4) / 2] & 0xfff; |
| 862 | if (m_sprites_master_scrollx >= 0x800) |
| 863 | m_sprites_master_scrollx -= 0x1000; /* signed value */ |
| 870 | 864 | |
| 871 | | state->m_sprites_master_scrolly = state->m_spriteram_buffered[(offs + 6) / 2] & 0xfff; |
| 872 | | if (state->m_sprites_master_scrolly >= 0x800) |
| 873 | | state->m_sprites_master_scrolly -= 0x1000; /* signed value */ |
| 865 | m_sprites_master_scrolly = m_spriteram_buffered[(offs + 6) / 2] & 0xfff; |
| 866 | if (m_sprites_master_scrolly >= 0x800) |
| 867 | m_sprites_master_scrolly -= 0x1000; /* signed value */ |
| 874 | 868 | } |
| 875 | 869 | } |
| 876 | 870 | } |
| r21022 | r21023 | |
| 881 | 875 | // rising edge |
| 882 | 876 | if (state) |
| 883 | 877 | { |
| 884 | | taitof2_update_sprites_active_area(machine()); |
| 878 | taitof2_update_sprites_active_area(); |
| 885 | 879 | |
| 886 | 880 | m_prepare_sprites = 1; |
| 887 | 881 | } |
| r21022 | r21023 | |
| 895 | 889 | UINT16 *spriteram = m_spriteram; |
| 896 | 890 | int i; |
| 897 | 891 | |
| 898 | | taitof2_update_sprites_active_area(machine()); |
| 892 | taitof2_update_sprites_active_area(); |
| 899 | 893 | |
| 900 | 894 | m_prepare_sprites = 0; |
| 901 | 895 | memcpy(m_spriteram_buffered, m_spriteram_delayed, m_spriteram.bytes()); |
| r21022 | r21023 | |
| 913 | 907 | UINT16 *spriteram = m_spriteram; |
| 914 | 908 | int i; |
| 915 | 909 | |
| 916 | | taitof2_update_sprites_active_area(machine()); |
| 910 | taitof2_update_sprites_active_area(); |
| 917 | 911 | |
| 918 | 912 | m_prepare_sprites = 0; |
| 919 | 913 | memcpy(m_spriteram_buffered, m_spriteram_delayed, m_spriteram.bytes()); |
| r21022 | r21023 | |
| 931 | 925 | UINT16 *spriteram = m_spriteram; |
| 932 | 926 | int i; |
| 933 | 927 | |
| 934 | | taitof2_update_sprites_active_area(machine()); |
| 928 | taitof2_update_sprites_active_area(); |
| 935 | 929 | |
| 936 | 930 | m_prepare_sprites = 0; |
| 937 | 931 | memcpy(m_spriteram_buffered, m_spriteram_delayed, m_spriteram.bytes()); |
| r21022 | r21023 | |
| 956 | 950 | UINT16 *spriteram = m_spriteram; |
| 957 | 951 | int i; |
| 958 | 952 | |
| 959 | | taitof2_update_sprites_active_area(machine()); |
| 953 | taitof2_update_sprites_active_area(); |
| 960 | 954 | |
| 961 | 955 | m_prepare_sprites = 0; |
| 962 | 956 | memcpy(m_spriteram_buffered, m_spriteram_delayed, m_spriteram.bytes()); |
| r21022 | r21023 | |
| 977 | 971 | /* SSI */ |
| 978 | 972 | UINT32 taitof2_state::screen_update_taitof2_ssi(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) |
| 979 | 973 | { |
| 980 | | taitof2_handle_sprite_buffering(machine()); |
| 974 | taitof2_handle_sprite_buffering(); |
| 981 | 975 | |
| 982 | 976 | /* SSI only uses sprites, the tilemap registers are not even initialized. |
| 983 | 977 | (they are in Majestic 12, but the tilemaps are not used anyway) */ |
| 984 | 978 | machine().priority_bitmap.fill(0, cliprect); |
| 985 | 979 | bitmap.fill(0, cliprect); |
| 986 | | draw_sprites(machine(), bitmap, cliprect, NULL, 0); |
| 980 | draw_sprites(bitmap, cliprect, NULL, 0); |
| 987 | 981 | return 0; |
| 988 | 982 | } |
| 989 | 983 | |
| 990 | 984 | |
| 991 | 985 | UINT32 taitof2_state::screen_update_taitof2_yesnoj(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) |
| 992 | 986 | { |
| 993 | | taitof2_handle_sprite_buffering(machine()); |
| 987 | taitof2_handle_sprite_buffering(); |
| 994 | 988 | |
| 995 | 989 | tc0100scn_tilemap_update(m_tc0100scn); |
| 996 | 990 | |
| 997 | 991 | machine().priority_bitmap.fill(0, cliprect); |
| 998 | 992 | bitmap.fill(0, cliprect); /* wrong color? */ |
| 999 | | draw_sprites(machine(), bitmap, cliprect, NULL, 0); |
| 993 | draw_sprites(bitmap, cliprect, NULL, 0); |
| 1000 | 994 | tc0100scn_tilemap_draw(m_tc0100scn, bitmap, cliprect, tc0100scn_bottomlayer(m_tc0100scn), 0, 0); |
| 1001 | 995 | tc0100scn_tilemap_draw(m_tc0100scn, bitmap, cliprect, tc0100scn_bottomlayer(m_tc0100scn) ^ 1, 0, 0); |
| 1002 | 996 | tc0100scn_tilemap_draw(m_tc0100scn, bitmap, cliprect, 2, 0, 0); |
| r21022 | r21023 | |
| 1006 | 1000 | |
| 1007 | 1001 | UINT32 taitof2_state::screen_update_taitof2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) |
| 1008 | 1002 | { |
| 1009 | | taitof2_handle_sprite_buffering(machine()); |
| 1003 | taitof2_handle_sprite_buffering(); |
| 1010 | 1004 | |
| 1011 | 1005 | tc0100scn_tilemap_update(m_tc0100scn); |
| 1012 | 1006 | |
| r21022 | r21023 | |
| 1014 | 1008 | bitmap.fill(0, cliprect); /* wrong color? */ |
| 1015 | 1009 | tc0100scn_tilemap_draw(m_tc0100scn, bitmap, cliprect, tc0100scn_bottomlayer(m_tc0100scn), 0, 0); |
| 1016 | 1010 | tc0100scn_tilemap_draw(m_tc0100scn, bitmap, cliprect, tc0100scn_bottomlayer(m_tc0100scn) ^ 1, 0, 0); |
| 1017 | | draw_sprites(machine(), bitmap, cliprect, NULL, 0); |
| 1011 | draw_sprites(bitmap, cliprect, NULL, 0); |
| 1018 | 1012 | tc0100scn_tilemap_draw(m_tc0100scn, bitmap, cliprect, 2, 0, 0); |
| 1019 | 1013 | return 0; |
| 1020 | 1014 | } |
| r21022 | r21023 | |
| 1025 | 1019 | address_space &space = machine().driver_data()->generic_space(); |
| 1026 | 1020 | int layer[3]; |
| 1027 | 1021 | |
| 1028 | | taitof2_handle_sprite_buffering(machine()); |
| 1022 | taitof2_handle_sprite_buffering(); |
| 1029 | 1023 | |
| 1030 | 1024 | tc0100scn_tilemap_update(m_tc0100scn); |
| 1031 | 1025 | |
| r21022 | r21023 | |
| 1050 | 1044 | tc0100scn_tilemap_draw(m_tc0100scn, bitmap, cliprect, layer[1], 0, 2); |
| 1051 | 1045 | tc0100scn_tilemap_draw(m_tc0100scn, bitmap, cliprect, layer[2], 0, 4); |
| 1052 | 1046 | |
| 1053 | | draw_sprites(machine(), bitmap, cliprect, NULL, 1); |
| 1047 | draw_sprites(bitmap, cliprect, NULL, 1); |
| 1054 | 1048 | return 0; |
| 1055 | 1049 | } |
| 1056 | 1050 | |
| 1057 | 1051 | |
| 1058 | 1052 | |
| 1059 | | static void draw_roz_layer( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT32 priority) |
| 1053 | void taitof2_state::draw_roz_layer( bitmap_ind16 &bitmap, const rectangle &cliprect, UINT32 priority) |
| 1060 | 1054 | { |
| 1061 | | taitof2_state *state = machine.driver_data<taitof2_state>(); |
| 1062 | 1055 | |
| 1063 | | if (state->m_tc0280grd != NULL) |
| 1064 | | tc0280grd_zoom_draw(state->m_tc0280grd, bitmap, cliprect, state->m_pivot_xdisp, state->m_pivot_ydisp, priority); |
| 1056 | if (m_tc0280grd != NULL) |
| 1057 | tc0280grd_zoom_draw(m_tc0280grd, bitmap, cliprect, m_pivot_xdisp, m_pivot_ydisp, priority); |
| 1065 | 1058 | |
| 1066 | | if (state->m_tc0430grw != NULL) |
| 1067 | | tc0430grw_zoom_draw(state->m_tc0430grw, bitmap, cliprect, state->m_pivot_xdisp, state->m_pivot_ydisp, priority); |
| 1059 | if (m_tc0430grw != NULL) |
| 1060 | tc0430grw_zoom_draw(m_tc0430grw, bitmap, cliprect, m_pivot_xdisp, m_pivot_ydisp, priority); |
| 1068 | 1061 | } |
| 1069 | 1062 | |
| 1070 | 1063 | UINT32 taitof2_state::screen_update_taitof2_pri_roz(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) |
| r21022 | r21023 | |
| 1077 | 1070 | int i,j; |
| 1078 | 1071 | int roz_base_color = (tc0360pri_r(m_tc0360pri, space, 1) & 0x3f) << 2; |
| 1079 | 1072 | |
| 1080 | | taitof2_handle_sprite_buffering(machine()); |
| 1073 | taitof2_handle_sprite_buffering(); |
| 1081 | 1074 | |
| 1082 | 1075 | if (m_tc0280grd != NULL) |
| 1083 | 1076 | tc0280grd_tilemap_update(m_tc0280grd, roz_base_color); |
| r21022 | r21023 | |
| 1113 | 1106 | { |
| 1114 | 1107 | if (rozpri == i) |
| 1115 | 1108 | { |
| 1116 | | draw_roz_layer(machine(), bitmap, cliprect, 1 << drawn); |
| 1109 | draw_roz_layer(bitmap, cliprect, 1 << drawn); |
| 1117 | 1110 | m_tilepri[drawn] = i; |
| 1118 | 1111 | drawn++; |
| 1119 | 1112 | } |
| r21022 | r21023 | |
| 1129 | 1122 | } |
| 1130 | 1123 | } |
| 1131 | 1124 | |
| 1132 | | draw_sprites(machine(), bitmap, cliprect, NULL, 1); |
| 1125 | draw_sprites(bitmap, cliprect, NULL, 1); |
| 1133 | 1126 | return 0; |
| 1134 | 1127 | } |
| 1135 | 1128 | |
| r21022 | r21023 | |
| 1144 | 1137 | int layer[2][3]; |
| 1145 | 1138 | int drawn[2]; |
| 1146 | 1139 | |
| 1147 | | taitof2_handle_sprite_buffering(machine()); |
| 1140 | taitof2_handle_sprite_buffering(); |
| 1148 | 1141 | |
| 1149 | 1142 | tc0100scn_tilemap_update(m_tc0100scn_1); |
| 1150 | 1143 | tc0100scn_tilemap_update(m_tc0100scn_2); |
| r21022 | r21023 | |
| 1220 | 1213 | if (spritepri[i] < tilepri[1][1]) primasks[i] |= 0xff00; |
| 1221 | 1214 | } |
| 1222 | 1215 | |
| 1223 | | draw_sprites(machine(), bitmap,cliprect,primasks,0); |
| 1216 | draw_sprites(bitmap,cliprect,primasks,0); |
| 1224 | 1217 | } |
| 1225 | 1218 | |
| 1226 | 1219 | |
| r21022 | r21023 | |
| 1279 | 1272 | UINT8 layer[5], invlayer[4]; |
| 1280 | 1273 | UINT16 priority; |
| 1281 | 1274 | |
| 1282 | | taitof2_handle_sprite_buffering(machine()); |
| 1275 | taitof2_handle_sprite_buffering(); |
| 1283 | 1276 | |
| 1284 | 1277 | tc0480scp_tilemap_update(m_tc0480scp); |
| 1285 | 1278 | |
| r21022 | r21023 | |
| 1318 | 1311 | tc0480scp_tilemap_draw(m_tc0480scp, bitmap, cliprect, layer[3], 0, 8); |
| 1319 | 1312 | tc0480scp_tilemap_draw(m_tc0480scp, bitmap, cliprect, layer[4], 0, 16); |
| 1320 | 1313 | |
| 1321 | | draw_sprites(machine(), bitmap, cliprect, NULL, 1); |
| 1314 | draw_sprites(bitmap, cliprect, NULL, 1); |
| 1322 | 1315 | return 0; |
| 1323 | 1316 | } |
| 1324 | 1317 | |
| r21022 | r21023 | |
| 1332 | 1325 | UINT8 spritepri[4]; |
| 1333 | 1326 | UINT16 priority; |
| 1334 | 1327 | |
| 1335 | | taitof2_handle_sprite_buffering(machine()); |
| 1328 | taitof2_handle_sprite_buffering(); |
| 1336 | 1329 | |
| 1337 | 1330 | tc0480scp_tilemap_update(m_tc0480scp); |
| 1338 | 1331 | |
| r21022 | r21023 | |
| 1377 | 1370 | if (spritepri[i] < tilepri[(layer[3])]) primasks[i] |= 0xff00; |
| 1378 | 1371 | } |
| 1379 | 1372 | |
| 1380 | | draw_sprites(machine(), bitmap, cliprect, primasks, 0); |
| 1373 | draw_sprites(bitmap, cliprect, primasks, 0); |
| 1381 | 1374 | } |
| 1382 | 1375 | |
| 1383 | 1376 | /* |
trunk/src/mame/video/twin16.c
| r21022 | r21023 | |
| 142 | 142 | m_sprite_busy = 0; |
| 143 | 143 | } |
| 144 | 144 | |
| 145 | | static int twin16_set_sprite_timer( running_machine &machine ) |
| 145 | int twin16_state::twin16_set_sprite_timer( ) |
| 146 | 146 | { |
| 147 | | twin16_state *state = machine.driver_data<twin16_state>(); |
| 148 | | if (state->m_sprite_busy) return 1; |
| 147 | if (m_sprite_busy) return 1; |
| 149 | 148 | |
| 150 | 149 | // sprite system busy, maybe a dma? time is guessed, assume 4 scanlines |
| 151 | | state->m_sprite_busy = 1; |
| 152 | | state->m_sprite_timer->adjust(machine.primary_screen->frame_period() / machine.primary_screen->height() * 4); |
| 150 | m_sprite_busy = 1; |
| 151 | m_sprite_timer->adjust(machine().primary_screen->frame_period() / machine().primary_screen->height() * 4); |
| 153 | 152 | |
| 154 | 153 | return 0; |
| 155 | 154 | } |
| 156 | 155 | |
| 157 | | void twin16_spriteram_process( running_machine &machine ) |
| 156 | void twin16_state::twin16_spriteram_process( ) |
| 158 | 157 | { |
| 159 | | twin16_state *state = machine.driver_data<twin16_state>(); |
| 160 | | UINT16 *spriteram16 = state->m_spriteram->live(); |
| 161 | | UINT16 dx = state->m_scrollx[0]; |
| 162 | | UINT16 dy = state->m_scrolly[0]; |
| 158 | UINT16 *spriteram16 = m_spriteram->live(); |
| 159 | UINT16 dx = m_scrollx[0]; |
| 160 | UINT16 dy = m_scrolly[0]; |
| 163 | 161 | |
| 164 | 162 | const UINT16 *source = &spriteram16[0x0000]; |
| 165 | 163 | const UINT16 *finish = &spriteram16[0x1800]; |
| 166 | 164 | |
| 167 | | twin16_set_sprite_timer(machine); |
| 165 | twin16_set_sprite_timer(); |
| 168 | 166 | memset(&spriteram16[0x1800],0xff,0x800*sizeof(UINT16)); |
| 169 | 167 | |
| 170 | 168 | while( source<finish ) |
| r21022 | r21023 | |
| 213 | 211 | } |
| 214 | 212 | source += 0x50/2; |
| 215 | 213 | } |
| 216 | | state->m_need_process_spriteram = 0; |
| 214 | m_need_process_spriteram = 0; |
| 217 | 215 | } |
| 218 | 216 | |
| 219 | | static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap ) |
| 217 | void twin16_state::draw_sprites( bitmap_ind16 &bitmap ) |
| 220 | 218 | { |
| 221 | | twin16_state *state = machine.driver_data<twin16_state>(); |
| 222 | | const UINT16 *source = 0x1800+state->m_spriteram->buffer() + 0x800 - 4; |
| 223 | | const UINT16 *finish = 0x1800+state->m_spriteram->buffer(); |
| 219 | const UINT16 *source = 0x1800+m_spriteram->buffer() + 0x800 - 4; |
| 220 | const UINT16 *finish = 0x1800+m_spriteram->buffer(); |
| 224 | 221 | |
| 225 | 222 | for (; source >= finish; source -= 4) |
| 226 | 223 | { |
| r21022 | r21023 | |
| 241 | 238 | int flipx = attributes&0x0100; |
| 242 | 239 | int priority = (attributes&0x4000)?TWIN16_SPRITE_PRI_L1:TWIN16_SPRITE_PRI_L2; |
| 243 | 240 | |
| 244 | | if( state->m_custom_video ) { |
| 241 | if( m_custom_video ) { |
| 245 | 242 | /* fround board */ |
| 246 | | pen_data = state->m_gfx_rom + 0x80000; |
| 243 | pen_data = m_gfx_rom + 0x80000; |
| 247 | 244 | } |
| 248 | 245 | else |
| 249 | 246 | { |
| r21022 | r21023 | |
| 251 | 248 | { |
| 252 | 249 | /* bank select */ |
| 253 | 250 | case 0: |
| 254 | | pen_data = state->m_gfx_rom; |
| 251 | pen_data = m_gfx_rom; |
| 255 | 252 | break; |
| 256 | 253 | |
| 257 | 254 | case 1: |
| 258 | | pen_data = state->m_gfx_rom + 0x40000; |
| 255 | pen_data = m_gfx_rom + 0x40000; |
| 259 | 256 | break; |
| 260 | 257 | |
| 261 | 258 | case 2: |
| 262 | | pen_data = state->m_gfx_rom + 0x80000; |
| 259 | pen_data = m_gfx_rom + 0x80000; |
| 263 | 260 | if( code&0x4000 ) pen_data += 0x40000; |
| 264 | 261 | break; |
| 265 | 262 | |
| 266 | 263 | case 3: |
| 267 | | pen_data = state->m_sprite_gfx_ram; |
| 264 | pen_data = m_sprite_gfx_ram; |
| 268 | 265 | break; |
| 269 | 266 | } |
| 270 | 267 | code &= 0xfff; |
| r21022 | r21023 | |
| 277 | 274 | |
| 278 | 275 | pen_data += code*0x40; |
| 279 | 276 | |
| 280 | | if( state->m_video_register&TWIN16_SCREEN_FLIPY ) |
| 277 | if( m_video_register&TWIN16_SCREEN_FLIPY ) |
| 281 | 278 | { |
| 282 | 279 | if (ypos>65000) ypos=ypos-65536; /* Bit hacky */ |
| 283 | 280 | ypos = 256-ypos-height; |
| 284 | 281 | flipy = !flipy; |
| 285 | 282 | } |
| 286 | | if( state->m_video_register&TWIN16_SCREEN_FLIPX ) |
| 283 | if( m_video_register&TWIN16_SCREEN_FLIPX ) |
| 287 | 284 | { |
| 288 | 285 | if (xpos>65000) xpos=xpos-65536; /* Bit hacky */ |
| 289 | 286 | xpos = 320-xpos-width; |
| r21022 | r21023 | |
| 299 | 296 | if( sy>=16 && sy<256-16 ) |
| 300 | 297 | { |
| 301 | 298 | UINT16 *dest = &bitmap.pix16(sy); |
| 302 | | UINT8 *pdest = &machine.priority_bitmap.pix8(sy); |
| 299 | UINT8 *pdest = &machine().priority_bitmap.pix8(sy); |
| 303 | 300 | |
| 304 | 301 | for( x=0; x<width; x++ ) |
| 305 | 302 | { |
| r21022 | r21023 | |
| 314 | 311 | |
| 315 | 312 | if (pdest[sx]<priority) { |
| 316 | 313 | if (shadow) { |
| 317 | | dest[sx] = machine.shadow_table[dest[sx]]; |
| 314 | dest[sx] = machine().shadow_table[dest[sx]]; |
| 318 | 315 | pdest[sx]|=TWIN16_SPRITE_CAST_SHADOW; |
| 319 | 316 | } |
| 320 | 317 | else { |
| r21022 | r21023 | |
| 323 | 320 | } |
| 324 | 321 | else if (!shadow && pdest[sx]&TWIN16_SPRITE_CAST_SHADOW && (pdest[sx]&0xf)<priority) { |
| 325 | 322 | // shadow cast onto sprite below, evident in devilw lava level |
| 326 | | dest[sx] = machine.shadow_table[pal_base + pen]; |
| 323 | dest[sx] = machine().shadow_table[pal_base + pen]; |
| 327 | 324 | pdest[sx]^=TWIN16_SPRITE_CAST_SHADOW; |
| 328 | 325 | } |
| 329 | 326 | |
| r21022 | r21023 | |
| 339 | 336 | |
| 340 | 337 | |
| 341 | 338 | |
| 342 | | static void draw_layer( running_machine &machine, bitmap_ind16 &bitmap, int opaque ) |
| 339 | void twin16_state::draw_layer( bitmap_ind16 &bitmap, int opaque ) |
| 343 | 340 | { |
| 344 | | twin16_state *state = machine.driver_data<twin16_state>(); |
| 345 | | UINT16 *videoram = state->m_videoram; |
| 341 | UINT16 *videoram = m_videoram; |
| 346 | 342 | const UINT16 *gfx_base; |
| 347 | 343 | const UINT16 *source = videoram; |
| 348 | 344 | int i, xxor, yxor; |
| 349 | 345 | int bank_table[4]; |
| 350 | 346 | int dx, dy, palette; |
| 351 | | int tile_flipx = state->m_video_register&TWIN16_TILE_FLIPX; |
| 352 | | int tile_flipy = state->m_video_register&TWIN16_TILE_FLIPY; |
| 347 | int tile_flipx = m_video_register&TWIN16_TILE_FLIPX; |
| 348 | int tile_flipy = m_video_register&TWIN16_TILE_FLIPY; |
| 353 | 349 | |
| 354 | | if( ((state->m_video_register&TWIN16_PLANE_ORDER)?1:0) != opaque ) { |
| 350 | if( ((m_video_register&TWIN16_PLANE_ORDER)?1:0) != opaque ) { |
| 355 | 351 | source += 0x1000; |
| 356 | | dx = state->m_scrollx[2]; |
| 357 | | dy = state->m_scrolly[2]; |
| 352 | dx = m_scrollx[2]; |
| 353 | dy = m_scrolly[2]; |
| 358 | 354 | palette = 1; |
| 359 | 355 | } |
| 360 | 356 | else { |
| 361 | 357 | source += 0x0000; |
| 362 | | dx = state->m_scrollx[1]; |
| 363 | | dy = state->m_scrolly[1]; |
| 358 | dx = m_scrollx[1]; |
| 359 | dy = m_scrolly[1]; |
| 364 | 360 | palette = 0; |
| 365 | 361 | } |
| 366 | 362 | |
| 367 | | if( state->m_custom_video ) { |
| 363 | if( m_custom_video ) { |
| 368 | 364 | /* fround board */ |
| 369 | | gfx_base = state->m_gfx_rom; |
| 370 | | bank_table[3] = (state->m_gfx_bank>>(4*3))&0xf; |
| 371 | | bank_table[2] = (state->m_gfx_bank>>(4*2))&0xf; |
| 372 | | bank_table[1] = (state->m_gfx_bank>>(4*1))&0xf; |
| 373 | | bank_table[0] = (state->m_gfx_bank>>(4*0))&0xf; |
| 365 | gfx_base = m_gfx_rom; |
| 366 | bank_table[3] = (m_gfx_bank>>(4*3))&0xf; |
| 367 | bank_table[2] = (m_gfx_bank>>(4*2))&0xf; |
| 368 | bank_table[1] = (m_gfx_bank>>(4*1))&0xf; |
| 369 | bank_table[0] = (m_gfx_bank>>(4*0))&0xf; |
| 374 | 370 | } |
| 375 | 371 | else { |
| 376 | | gfx_base = state->m_tile_gfx_ram; |
| 372 | gfx_base = m_tile_gfx_ram; |
| 377 | 373 | bank_table[0] = 0; |
| 378 | 374 | bank_table[1] = 1; |
| 379 | 375 | bank_table[2] = 2; |
| 380 | 376 | bank_table[3] = 3; |
| 381 | 377 | } |
| 382 | 378 | |
| 383 | | if( state->m_video_register&TWIN16_SCREEN_FLIPX ) |
| 379 | if( m_video_register&TWIN16_SCREEN_FLIPX ) |
| 384 | 380 | { |
| 385 | 381 | dx = 256-dx-64; |
| 386 | 382 | tile_flipx = !tile_flipx; |
| 387 | 383 | } |
| 388 | 384 | |
| 389 | | if( state->m_video_register&TWIN16_SCREEN_FLIPY ) |
| 385 | if( m_video_register&TWIN16_SCREEN_FLIPY ) |
| 390 | 386 | { |
| 391 | 387 | dy = 256-dy; |
| 392 | 388 | tile_flipy = !tile_flipy; |
| r21022 | r21023 | |
| 402 | 398 | int sy = (i/64)*8; |
| 403 | 399 | int xpos,ypos; |
| 404 | 400 | |
| 405 | | if( state->m_video_register&TWIN16_SCREEN_FLIPX ) sx = 63*8 - sx; |
| 406 | | if( state->m_video_register&TWIN16_SCREEN_FLIPY ) sy = 63*8 - sy; |
| 401 | if( m_video_register&TWIN16_SCREEN_FLIPX ) sx = 63*8 - sx; |
| 402 | if( m_video_register&TWIN16_SCREEN_FLIPY ) sy = 63*8 - sy; |
| 407 | 403 | |
| 408 | 404 | xpos = (sx-dx)&0x1ff; |
| 409 | 405 | ypos = (sy-dy)&0x1ff; |
| r21022 | r21023 | |
| 434 | 430 | { |
| 435 | 431 | const UINT16 *gfxptr = gfx_data + ((y - ypos) ^ yxor) * 2; |
| 436 | 432 | UINT16 *dest = &bitmap.pix16(y); |
| 437 | | UINT8 *pdest = &machine.priority_bitmap.pix8(y); |
| 433 | UINT8 *pdest = &machine().priority_bitmap.pix8(y); |
| 438 | 434 | |
| 439 | 435 | for (x = x1; x <= x2; x++) |
| 440 | 436 | { |
| r21022 | r21023 | |
| 451 | 447 | { |
| 452 | 448 | const UINT16 *gfxptr = gfx_data + ((y - ypos) ^ yxor) * 2; |
| 453 | 449 | UINT16 *dest = &bitmap.pix16(y); |
| 454 | | UINT8 *pdest = &machine.priority_bitmap.pix8(y); |
| 450 | UINT8 *pdest = &machine().priority_bitmap.pix8(y); |
| 455 | 451 | |
| 456 | 452 | for (x = x1; x <= x2; x++) |
| 457 | 453 | { |
| r21022 | r21023 | |
| 520 | 516 | if (m_video_register&TWIN16_SCREEN_FLIPY) text_flip|=TILEMAP_FLIPY; |
| 521 | 517 | |
| 522 | 518 | machine().priority_bitmap.fill(0, cliprect); |
| 523 | | draw_layer( machine(), bitmap, 1 ); |
| 524 | | draw_layer( machine(), bitmap, 0 ); |
| 525 | | draw_sprites( machine(), bitmap ); |
| 519 | draw_layer( bitmap, 1 ); |
| 520 | draw_layer( bitmap, 0 ); |
| 521 | draw_sprites( bitmap ); |
| 526 | 522 | |
| 527 | 523 | if (text_flip) m_text_tilemap->set_flip(text_flip); |
| 528 | 524 | m_text_tilemap->draw(bitmap, cliprect, 0, 0); |
| r21022 | r21023 | |
| 534 | 530 | // rising edge |
| 535 | 531 | if (state) |
| 536 | 532 | { |
| 537 | | twin16_set_sprite_timer(machine()); |
| 533 | twin16_set_sprite_timer(); |
| 538 | 534 | |
| 539 | | if (twin16_spriteram_process_enable(machine())) { |
| 540 | | if (m_need_process_spriteram) twin16_spriteram_process(machine()); |
| 535 | if (twin16_spriteram_process_enable()) { |
| 536 | if (m_need_process_spriteram) twin16_spriteram_process(); |
| 541 | 537 | m_need_process_spriteram = 1; |
| 542 | 538 | |
| 543 | 539 | /* if the sprite preprocessor is used, sprite ram is copied to an external buffer first, |
trunk/src/mame/video/twincobr.c
| r21022 | r21023 | |
| 85 | 85 | Start the video hardware emulation. |
| 86 | 86 | ***************************************************************************/ |
| 87 | 87 | |
| 88 | | static void twincobr_create_tilemaps(running_machine &machine) |
| 88 | void twincobr_state::twincobr_create_tilemaps() |
| 89 | 89 | { |
| 90 | | twincobr_state *state = machine.driver_data<twincobr_state>(); |
| 90 | m_bg_tilemap = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(twincobr_state::get_bg_tile_info),this),TILEMAP_SCAN_ROWS,8,8,64,64); |
| 91 | m_fg_tilemap = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(twincobr_state::get_fg_tile_info),this),TILEMAP_SCAN_ROWS,8,8,64,64); |
| 92 | m_tx_tilemap = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(twincobr_state::get_tx_tile_info),this),TILEMAP_SCAN_ROWS,8,8,64,32); |
| 91 | 93 | |
| 92 | | state->m_bg_tilemap = &machine.tilemap().create(tilemap_get_info_delegate(FUNC(twincobr_state::get_bg_tile_info),state),TILEMAP_SCAN_ROWS,8,8,64,64); |
| 93 | | state->m_fg_tilemap = &machine.tilemap().create(tilemap_get_info_delegate(FUNC(twincobr_state::get_fg_tile_info),state),TILEMAP_SCAN_ROWS,8,8,64,64); |
| 94 | | state->m_tx_tilemap = &machine.tilemap().create(tilemap_get_info_delegate(FUNC(twincobr_state::get_tx_tile_info),state),TILEMAP_SCAN_ROWS,8,8,64,32); |
| 95 | | |
| 96 | | state->m_fg_tilemap->set_transparent_pen(0); |
| 97 | | state->m_tx_tilemap->set_transparent_pen(0); |
| 94 | m_fg_tilemap->set_transparent_pen(0); |
| 95 | m_tx_tilemap->set_transparent_pen(0); |
| 98 | 96 | } |
| 99 | 97 | |
| 100 | 98 | VIDEO_START_MEMBER(twincobr_state,toaplan0) |
| r21022 | r21023 | |
| 104 | 102 | m_bgvideoram_size = 0x2000; /* banked two times 0x1000 */ |
| 105 | 103 | m_fgvideoram_size = 0x1000; |
| 106 | 104 | |
| 107 | | twincobr_create_tilemaps(machine()); |
| 105 | twincobr_create_tilemaps(); |
| 108 | 106 | |
| 109 | 107 | m_txvideoram16 = auto_alloc_array_clear(machine(), UINT16, m_txvideoram_size); |
| 110 | 108 | m_fgvideoram16 = auto_alloc_array_clear(machine(), UINT16, m_fgvideoram_size); |
| 111 | 109 | m_bgvideoram16 = auto_alloc_array_clear(machine(), UINT16, m_bgvideoram_size); |
| 112 | 110 | |
| 113 | 111 | m_display_on = 0; |
| 114 | | twincobr_display(machine(), m_display_on); |
| 112 | twincobr_display(m_display_on); |
| 115 | 113 | |
| 116 | 114 | state_save_register_global_pointer(machine(), m_txvideoram16, m_txvideoram_size); |
| 117 | 115 | state_save_register_global_pointer(machine(), m_fgvideoram16, m_fgvideoram_size); |
| r21022 | r21023 | |
| 137 | 135 | |
| 138 | 136 | void twincobr_state::twincobr_restore_screen() |
| 139 | 137 | { |
| 140 | | twincobr_display(machine(), m_display_on); |
| 141 | | twincobr_flipscreen(machine(), m_flip_screen); |
| 138 | twincobr_display(m_display_on); |
| 139 | twincobr_flipscreen(m_flip_screen); |
| 142 | 140 | } |
| 143 | 141 | |
| 144 | 142 | |
| r21022 | r21023 | |
| 146 | 144 | Video I/O interface |
| 147 | 145 | ***************************************************************************/ |
| 148 | 146 | |
| 149 | | void twincobr_display(running_machine &machine, int enable) |
| 147 | void twincobr_state::twincobr_display(int enable) |
| 150 | 148 | { |
| 151 | | twincobr_state *state = machine.driver_data<twincobr_state>(); |
| 152 | 149 | |
| 153 | | state->m_display_on = enable; |
| 154 | | state->m_bg_tilemap->enable(enable); |
| 155 | | state->m_fg_tilemap->enable(enable); |
| 156 | | state->m_tx_tilemap->enable(enable); |
| 150 | m_display_on = enable; |
| 151 | m_bg_tilemap->enable(enable); |
| 152 | m_fg_tilemap->enable(enable); |
| 153 | m_tx_tilemap->enable(enable); |
| 157 | 154 | } |
| 158 | 155 | |
| 159 | | void twincobr_flipscreen(running_machine &machine, int flip) |
| 156 | void twincobr_state::twincobr_flipscreen(int flip) |
| 160 | 157 | { |
| 161 | | twincobr_state *state = machine.driver_data<twincobr_state>(); |
| 162 | 158 | |
| 163 | | machine.tilemap().set_flip_all((flip ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0)); |
| 164 | | state->m_flip_screen = flip; |
| 159 | machine().tilemap().set_flip_all((flip ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0)); |
| 160 | m_flip_screen = flip; |
| 165 | 161 | if (flip) { |
| 166 | | state->m_scroll_x = 0x008; |
| 167 | | state->m_scroll_y = 0x0c5; |
| 162 | m_scroll_x = 0x008; |
| 163 | m_scroll_y = 0x0c5; |
| 168 | 164 | } |
| 169 | 165 | else { |
| 170 | | state->m_scroll_x = 0x037; |
| 171 | | state->m_scroll_y = 0x01e; |
| 166 | m_scroll_x = 0x037; |
| 167 | m_scroll_y = 0x01e; |
| 172 | 168 | } |
| 173 | 169 | } |
| 174 | 170 | |
| r21022 | r21023 | |
| 352 | 348 | Ugly sprite hack for Wardner when hero is in shop |
| 353 | 349 | ***************************************************************************/ |
| 354 | 350 | |
| 355 | | static void wardner_sprite_priority_hack(running_machine &machine) |
| 351 | void twincobr_state::wardner_sprite_priority_hack() |
| 356 | 352 | { |
| 357 | | twincobr_state *state = machine.driver_data<twincobr_state>(); |
| 358 | 353 | |
| 359 | | if (state->m_fgscrollx != state->m_bgscrollx) { |
| 360 | | UINT16 *buffered_spriteram16 = reinterpret_cast<UINT16 *>(state->m_spriteram8->buffer()); |
| 361 | | if ((state->m_fgscrollx==0x1c9) || (state->m_flip_screen && (state->m_fgscrollx==0x17a))) { /* in the shop ? */ |
| 354 | if (m_fgscrollx != m_bgscrollx) { |
| 355 | UINT16 *buffered_spriteram16 = reinterpret_cast<UINT16 *>(m_spriteram8->buffer()); |
| 356 | if ((m_fgscrollx==0x1c9) || (m_flip_screen && (m_fgscrollx==0x17a))) { /* in the shop ? */ |
| 362 | 357 | int wardner_hack = buffered_spriteram16[0x0b04/2]; |
| 363 | 358 | /* sprite position 0x6300 to 0x8700 -- hero on shop keeper (normal) */ |
| 364 | 359 | /* sprite position 0x3900 to 0x5e00 -- hero on shop keeper (flip) */ |
| r21022 | r21023 | |
| 382 | 377 | |
| 383 | 378 | |
| 384 | 379 | |
| 385 | | static void twincobr_log_vram(running_machine &machine) |
| 380 | void twincobr_state::twincobr_log_vram() |
| 386 | 381 | { |
| 387 | 382 | #ifdef MAME_DEBUG |
| 388 | | twincobr_state *state = machine.driver_data<twincobr_state>(); |
| 389 | 383 | |
| 390 | | if ( machine.input().code_pressed(KEYCODE_M) ) |
| 384 | if ( machine().input().code_pressed(KEYCODE_M) ) |
| 391 | 385 | { |
| 392 | 386 | offs_t tile_voffs; |
| 393 | 387 | int tcode[4]; |
| 394 | | while (machine.input().code_pressed(KEYCODE_M)) ; |
| 388 | while (machine().input().code_pressed(KEYCODE_M)) ; |
| 395 | 389 | logerror("Scrolls BG-X BG-Y FG-X FG-Y TX-X TX-Y\n"); |
| 396 | | logerror("------> %04x %04x %04x %04x %04x %04x\n",state->m_bgscrollx,state->m_bgscrolly,state->m_fgscrollx,state->m_fgscrolly,state->m_txscrollx,state->m_txscrolly); |
| 397 | | for ( tile_voffs = 0; tile_voffs < (state->m_txvideoram_size/2); tile_voffs++ ) |
| 390 | logerror("------> %04x %04x %04x %04x %04x %04x\n",m_bgscrollx,m_bgscrolly,m_fgscrollx,m_fgscrolly,m_txscrollx,m_txscrolly); |
| 391 | for ( tile_voffs = 0; tile_voffs < (m_txvideoram_size/2); tile_voffs++ ) |
| 398 | 392 | { |
| 399 | | tcode[1] = state->m_bgvideoram16[tile_voffs]; |
| 400 | | tcode[2] = state->m_fgvideoram16[tile_voffs]; |
| 401 | | tcode[3] = state->m_txvideoram16[tile_voffs]; |
| 393 | tcode[1] = m_bgvideoram16[tile_voffs]; |
| 394 | tcode[2] = m_fgvideoram16[tile_voffs]; |
| 395 | tcode[3] = m_txvideoram16[tile_voffs]; |
| 402 | 396 | logerror("$(%04x) (Col-Tile) BG1:%01x-%03x FG1:%01x-%03x TX1:%02x-%03x\n", tile_voffs, |
| 403 | 397 | tcode[1] & 0xf000 >> 12, tcode[1] & 0x0fff, |
| 404 | 398 | tcode[2] & 0xf000 >> 12, tcode[2] & 0x0fff, |
| 405 | 399 | tcode[3] & 0xf800 >> 11, tcode[3] & 0x07ff); |
| 406 | 400 | } |
| 407 | | for ( tile_voffs = (state->m_txvideoram_size/2); tile_voffs < (state->m_fgvideoram_size/2); tile_voffs++ ) |
| 401 | for ( tile_voffs = (m_txvideoram_size/2); tile_voffs < (m_fgvideoram_size/2); tile_voffs++ ) |
| 408 | 402 | { |
| 409 | | tcode[1] = state->m_bgvideoram16[tile_voffs]; |
| 410 | | tcode[2] = state->m_fgvideoram16[tile_voffs]; |
| 403 | tcode[1] = m_bgvideoram16[tile_voffs]; |
| 404 | tcode[2] = m_fgvideoram16[tile_voffs]; |
| 411 | 405 | logerror("$(%04x) (Col-Tile) BG1:%01x-%03x FG1:%01x-%03x\n", tile_voffs, |
| 412 | 406 | tcode[1] & 0xf000 >> 12, tcode[1] & 0x0fff, |
| 413 | 407 | tcode[2] & 0xf000 >> 12, tcode[2] & 0x0fff); |
| 414 | 408 | } |
| 415 | | for ( tile_voffs = (state->m_fgvideoram_size/2); tile_voffs < (state->m_bgvideoram_size/2); tile_voffs++ ) |
| 409 | for ( tile_voffs = (m_fgvideoram_size/2); tile_voffs < (m_bgvideoram_size/2); tile_voffs++ ) |
| 416 | 410 | { |
| 417 | | tcode[1] = state->m_bgvideoram16[tile_voffs]; |
| 411 | tcode[1] = m_bgvideoram16[tile_voffs]; |
| 418 | 412 | logerror("$(%04x) (Col-Tile) BG1:%01x-%03x\n", tile_voffs, |
| 419 | 413 | tcode[1] & 0xf000 >> 12, tcode[1] & 0x0fff); |
| 420 | 414 | } |
| r21022 | r21023 | |
| 427 | 421 | Sprite Handlers |
| 428 | 422 | ***************************************************************************/ |
| 429 | 423 | |
| 430 | | static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority ) |
| 424 | void twincobr_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, int priority ) |
| 431 | 425 | { |
| 432 | | twincobr_state *state = machine.driver_data<twincobr_state>(); |
| 433 | 426 | int offs; |
| 434 | 427 | |
| 435 | | if (state->m_display_on) |
| 428 | if (m_display_on) |
| 436 | 429 | { |
| 437 | 430 | UINT16 *buffered_spriteram16; |
| 438 | 431 | UINT32 bytes; |
| 439 | | if (state->m_spriteram16 != NULL) |
| 432 | if (m_spriteram16 != NULL) |
| 440 | 433 | { |
| 441 | | buffered_spriteram16 = state->m_spriteram16->buffer(); |
| 442 | | bytes = state->m_spriteram16->bytes(); |
| 434 | buffered_spriteram16 = m_spriteram16->buffer(); |
| 435 | bytes = m_spriteram16->bytes(); |
| 443 | 436 | } |
| 444 | 437 | else |
| 445 | 438 | { |
| 446 | | buffered_spriteram16 = reinterpret_cast<UINT16 *>(state->m_spriteram8->buffer()); |
| 447 | | bytes = state->m_spriteram8->bytes(); |
| 439 | buffered_spriteram16 = reinterpret_cast<UINT16 *>(m_spriteram8->buffer()); |
| 440 | bytes = m_spriteram8->bytes(); |
| 448 | 441 | } |
| 449 | 442 | for (offs = 0;offs < bytes/2;offs += 4) |
| 450 | 443 | { |
| r21022 | r21023 | |
| 461 | 454 | flipx = attribute & 0x100; |
| 462 | 455 | if (flipx) sx -= 14; /* should really be 15 */ |
| 463 | 456 | flipy = attribute & 0x200; |
| 464 | | drawgfx_transpen(bitmap,cliprect,machine.gfx[3], |
| 457 | drawgfx_transpen(bitmap,cliprect,machine().gfx[3], |
| 465 | 458 | sprite, |
| 466 | 459 | color, |
| 467 | 460 | flipx,flipy, |
| r21022 | r21023 | |
| 479 | 472 | |
| 480 | 473 | UINT32 twincobr_state::screen_update_toaplan0(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) |
| 481 | 474 | { |
| 482 | | twincobr_log_vram(machine()); |
| 475 | twincobr_log_vram(); |
| 483 | 476 | |
| 484 | | if (m_wardner_sprite_hack) wardner_sprite_priority_hack(machine()); |
| 477 | if (m_wardner_sprite_hack) wardner_sprite_priority_hack(); |
| 485 | 478 | |
| 486 | 479 | bitmap.fill(0, cliprect); |
| 487 | 480 | |
| 488 | 481 | m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE,0); |
| 489 | | draw_sprites(machine(), bitmap,cliprect,0x0400); |
| 482 | draw_sprites(bitmap,cliprect,0x0400); |
| 490 | 483 | m_fg_tilemap->draw(bitmap, cliprect, 0,0); |
| 491 | | draw_sprites(machine(), bitmap,cliprect,0x0800); |
| 484 | draw_sprites(bitmap,cliprect,0x0800); |
| 492 | 485 | m_tx_tilemap->draw(bitmap, cliprect, 0,0); |
| 493 | | draw_sprites(machine(), bitmap,cliprect,0x0c00); |
| 486 | draw_sprites(bitmap,cliprect,0x0c00); |
| 494 | 487 | return 0; |
| 495 | 488 | } |
| 496 | 489 | |
trunk/src/mame/video/taito_b.c
| r21022 | r21023 | |
| 23 | 23 | COMBINE_DATA(&m_pixel_scroll[offset]); |
| 24 | 24 | } |
| 25 | 25 | |
| 26 | | static void hitice_clear_pixel_bitmap( running_machine &machine ) |
| 26 | void taitob_state::hitice_clear_pixel_bitmap( ) |
| 27 | 27 | { |
| 28 | 28 | int i; |
| 29 | | taitob_state *state = machine.driver_data<taitob_state>(); |
| 30 | | address_space &space = machine.device("maincpu")->memory().space(AS_PROGRAM); |
| 29 | address_space &space = machine().device("maincpu")->memory().space(AS_PROGRAM); |
| 31 | 30 | |
| 32 | 31 | for (i = 0; i < 0x40000; i++) |
| 33 | | state->hitice_pixelram_w(space, i, 0, 0xffff); |
| 32 | hitice_pixelram_w(space, i, 0, 0xffff); |
| 34 | 33 | } |
| 35 | 34 | |
| 36 | 35 | WRITE16_MEMBER(taitob_state::realpunc_video_ctrl_w) |
| r21022 | r21023 | |
| 95 | 94 | VIDEO_RESET_MEMBER(taitob_state,hitice) |
| 96 | 95 | { |
| 97 | 96 | /* kludge: clear the bitmap on startup */ |
| 98 | | hitice_clear_pixel_bitmap(machine()); |
| 97 | hitice_clear_pixel_bitmap(); |
| 99 | 98 | } |
| 100 | 99 | |
| 101 | 100 | |
| r21022 | r21023 | |
| 127 | 126 | } |
| 128 | 127 | |
| 129 | 128 | |
| 130 | | static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) |
| 129 | void taitob_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect ) |
| 131 | 130 | { |
| 132 | 131 | /* Sprite format: (16 bytes per sprite) |
| 133 | 132 | offs: bits: |
| r21022 | r21023 | |
| 158 | 157 | 000c - 000f: unused |
| 159 | 158 | */ |
| 160 | 159 | |
| 161 | | taitob_state *state = machine.driver_data<taitob_state>(); |
| 162 | 160 | int x, y, xlatch = 0, ylatch = 0, x_no = 0, y_no = 0, x_num = 0, y_num = 0, big_sprite = 0; |
| 163 | 161 | int offs, code, color, flipx, flipy; |
| 164 | 162 | UINT32 data, zoomx, zoomy, zx, zy, zoomxlatch = 0, zoomylatch = 0; |
| 165 | 163 | |
| 166 | 164 | for (offs = (0x1980 - 16) / 2; offs >=0; offs -= 8) |
| 167 | 165 | { |
| 168 | | code = state->m_spriteram[offs]; |
| 166 | code = m_spriteram[offs]; |
| 169 | 167 | |
| 170 | | color = state->m_spriteram[offs + 1]; |
| 168 | color = m_spriteram[offs + 1]; |
| 171 | 169 | flipx = color & 0x4000; |
| 172 | 170 | flipy = color & 0x8000; |
| 173 | 171 | #if 0 |
| r21022 | r21023 | |
| 180 | 178 | #endif |
| 181 | 179 | color = (color & 0x3f) * 16; |
| 182 | 180 | |
| 183 | | x = state->m_spriteram[offs + 2] & 0x3ff; |
| 184 | | y = state->m_spriteram[offs + 3] & 0x3ff; |
| 181 | x = m_spriteram[offs + 2] & 0x3ff; |
| 182 | y = m_spriteram[offs + 3] & 0x3ff; |
| 185 | 183 | if (x >= 0x200) x -= 0x400; |
| 186 | 184 | if (y >= 0x200) y -= 0x400; |
| 187 | 185 | |
| 188 | | data = state->m_spriteram[offs + 5]; |
| 186 | data = m_spriteram[offs + 5]; |
| 189 | 187 | if (data) |
| 190 | 188 | { |
| 191 | 189 | if (!big_sprite) |
| r21022 | r21023 | |
| 196 | 194 | y_no = 0; |
| 197 | 195 | xlatch = x; |
| 198 | 196 | ylatch = y; |
| 199 | | data = state->m_spriteram[offs + 4]; |
| 197 | data = m_spriteram[offs + 4]; |
| 200 | 198 | zoomxlatch = (data >> 8) & 0xff; |
| 201 | 199 | zoomylatch = (data >> 0) & 0xff; |
| 202 | 200 | big_sprite = 1; |
| 203 | 201 | } |
| 204 | 202 | } |
| 205 | 203 | |
| 206 | | data = state->m_spriteram[offs + 4]; |
| 204 | data = m_spriteram[offs + 4]; |
| 207 | 205 | zoomx = (data >> 8) & 0xff; |
| 208 | 206 | zoomy = (data >> 0) & 0xff; |
| 209 | 207 | zx = (0x100 - zoomx) / 16; |
| r21022 | r21023 | |
| 236 | 234 | |
| 237 | 235 | if ( zoomx || zoomy ) |
| 238 | 236 | { |
| 239 | | drawgfxzoom_transpen_raw(bitmap, cliprect, machine.gfx[1], |
| 237 | drawgfxzoom_transpen_raw(bitmap, cliprect, machine().gfx[1], |
| 240 | 238 | code, |
| 241 | 239 | color, |
| 242 | 240 | flipx,flipy, |
| r21022 | r21023 | |
| 245 | 243 | } |
| 246 | 244 | else |
| 247 | 245 | { |
| 248 | | drawgfx_transpen_raw (bitmap,cliprect,machine.gfx[1], |
| 246 | drawgfx_transpen_raw (bitmap,cliprect,machine().gfx[1], |
| 249 | 247 | code, |
| 250 | 248 | color, |
| 251 | 249 | flipx,flipy, |
| r21022 | r21023 | |
| 256 | 254 | } |
| 257 | 255 | |
| 258 | 256 | |
| 259 | | static void draw_framebuffer( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority ) |
| 257 | void taitob_state::draw_framebuffer( bitmap_ind16 &bitmap, const rectangle &cliprect, int priority ) |
| 260 | 258 | { |
| 261 | | taitob_state *state = machine.driver_data<taitob_state>(); |
| 262 | 259 | rectangle myclip = cliprect; |
| 263 | 260 | int x, y; |
| 264 | | address_space &space = machine.driver_data()->generic_space(); |
| 265 | | UINT8 video_control = tc0180vcu_get_videoctrl(state->m_tc0180vcu, space, 0); |
| 266 | | UINT8 framebuffer_page = tc0180vcu_get_fb_page(state->m_tc0180vcu, space, 0); |
| 261 | address_space &space = machine().driver_data()->generic_space(); |
| 262 | UINT8 video_control = tc0180vcu_get_videoctrl(m_tc0180vcu, space, 0); |
| 263 | UINT8 framebuffer_page = tc0180vcu_get_fb_page(m_tc0180vcu, space, 0); |
| 267 | 264 | |
| 268 | 265 | g_profiler.start(PROFILER_USER1); |
| 269 | 266 | |
| r21022 | r21023 | |
| 282 | 279 | /*popmessage("1. X[%3i;%3i] Y[%3i;%3i]", myclip.min_x, myclip.max_x, myclip.min_y, myclip.max_y);*/ |
| 283 | 280 | for (y = myclip.min_y; y <= myclip.max_y; y++) |
| 284 | 281 | { |
| 285 | | UINT16 *src = &state->m_framebuffer[framebuffer_page]->pix16(y, myclip.min_x); |
| 282 | UINT16 *src = &m_framebuffer[framebuffer_page]->pix16(y, myclip.min_x); |
| 286 | 283 | UINT16 *dst; |
| 287 | 284 | |
| 288 | 285 | dst = &bitmap.pix16(bitmap.height()-1-y, myclip.max_x); |
| r21022 | r21023 | |
| 292 | 289 | UINT16 c = *src++; |
| 293 | 290 | |
| 294 | 291 | if (c != 0) |
| 295 | | *dst = state->m_b_sp_color_base + c; |
| 292 | *dst = m_b_sp_color_base + c; |
| 296 | 293 | |
| 297 | 294 | dst--; |
| 298 | 295 | } |
| r21022 | r21023 | |
| 302 | 299 | { |
| 303 | 300 | for (y = myclip.min_y; y <= myclip.max_y; y++) |
| 304 | 301 | { |
| 305 | | UINT16 *src = &state->m_framebuffer[framebuffer_page]->pix16(y, myclip.min_x); |
| 302 | UINT16 *src = &m_framebuffer[framebuffer_page]->pix16(y, myclip.min_x); |
| 306 | 303 | UINT16 *dst = &bitmap.pix16(y, myclip.min_x); |
| 307 | 304 | |
| 308 | 305 | for (x = myclip.min_x; x <= myclip.max_x; x++) |
| r21022 | r21023 | |
| 310 | 307 | UINT16 c = *src++; |
| 311 | 308 | |
| 312 | 309 | if (c != 0) |
| 313 | | *dst = state->m_b_sp_color_base + c; |
| 310 | *dst = m_b_sp_color_base + c; |
| 314 | 311 | |
| 315 | 312 | dst++; |
| 316 | 313 | } |
| r21022 | r21023 | |
| 324 | 321 | /*popmessage("3. X[%3i;%3i] Y[%3i;%3i]", myclip.min_x, myclip.max_x, myclip.min_y, myclip.max_y);*/ |
| 325 | 322 | for (y = myclip.min_y ;y <= myclip.max_y; y++) |
| 326 | 323 | { |
| 327 | | UINT16 *src = &state->m_framebuffer[framebuffer_page]->pix16(y, myclip.min_x); |
| 324 | UINT16 *src = &m_framebuffer[framebuffer_page]->pix16(y, myclip.min_x); |
| 328 | 325 | UINT16 *dst; |
| 329 | 326 | |
| 330 | 327 | dst = &bitmap.pix16(bitmap.height()-1-y, myclip.max_x); |
| r21022 | r21023 | |
| 334 | 331 | UINT16 c = *src++; |
| 335 | 332 | |
| 336 | 333 | if (c != 0 && (c & 0x10) == priority) |
| 337 | | *dst = state->m_b_sp_color_base + c; |
| 334 | *dst = m_b_sp_color_base + c; |
| 338 | 335 | |
| 339 | 336 | dst--; |
| 340 | 337 | } |
| r21022 | r21023 | |
| 344 | 341 | { |
| 345 | 342 | for (y = myclip.min_y; y <= myclip.max_y; y++) |
| 346 | 343 | { |
| 347 | | UINT16 *src = &state->m_framebuffer[framebuffer_page]->pix16(y, myclip.min_x); |
| 344 | UINT16 *src = &m_framebuffer[framebuffer_page]->pix16(y, myclip.min_x); |
| 348 | 345 | UINT16 *dst = &bitmap.pix16(y, myclip.min_x); |
| 349 | 346 | |
| 350 | 347 | for (x = myclip.min_x; x <= myclip.max_x; x++) |
| r21022 | r21023 | |
| 352 | 349 | UINT16 c = *src++; |
| 353 | 350 | |
| 354 | 351 | if (c != 0 && (c & 0x10) == priority) |
| 355 | | *dst = state->m_b_sp_color_base + c; |
| 352 | *dst = m_b_sp_color_base + c; |
| 356 | 353 | |
| 357 | 354 | dst++; |
| 358 | 355 | } |
| r21022 | r21023 | |
| 376 | 373 | /* Draw playfields */ |
| 377 | 374 | tc0180vcu_tilemap_draw(m_tc0180vcu, bitmap, cliprect, 0, 1); |
| 378 | 375 | |
| 379 | | draw_framebuffer(machine(), bitmap, cliprect, 1); |
| 376 | draw_framebuffer(bitmap, cliprect, 1); |
| 380 | 377 | |
| 381 | 378 | tc0180vcu_tilemap_draw(m_tc0180vcu, bitmap, cliprect, 1, 0); |
| 382 | 379 | |
| r21022 | r21023 | |
| 389 | 386 | copyscrollbitmap_trans(bitmap, *m_pixel_bitmap, 1, &scrollx, 1, &scrolly, cliprect, m_b_fg_color_base * 16); |
| 390 | 387 | } |
| 391 | 388 | |
| 392 | | draw_framebuffer(machine(), bitmap, cliprect, 0); |
| 389 | draw_framebuffer(bitmap, cliprect, 0); |
| 393 | 390 | |
| 394 | 391 | tc0180vcu_tilemap_draw(m_tc0180vcu, bitmap, cliprect, 2, 0); |
| 395 | 392 | |
| r21022 | r21023 | |
| 415 | 412 | /* Draw the palettized playfields to an indexed bitmap */ |
| 416 | 413 | tc0180vcu_tilemap_draw(m_tc0180vcu, *m_realpunc_bitmap, cliprect, 0, 1); |
| 417 | 414 | |
| 418 | | draw_framebuffer(machine(), *m_realpunc_bitmap, cliprect, 1); |
| 415 | draw_framebuffer(*m_realpunc_bitmap, cliprect, 1); |
| 419 | 416 | |
| 420 | 417 | tc0180vcu_tilemap_draw(m_tc0180vcu, *m_realpunc_bitmap, cliprect, 1, 0); |
| 421 | 418 | |
| 422 | 419 | if (m_realpunc_video_ctrl & 0x0001) |
| 423 | | draw_framebuffer(machine(), *m_realpunc_bitmap, cliprect, 0); |
| 420 | draw_framebuffer(*m_realpunc_bitmap, cliprect, 0); |
| 424 | 421 | |
| 425 | 422 | /* Copy the intermediate bitmap to the output bitmap, applying the palette */ |
| 426 | 423 | for (y = 0; y <= cliprect.max_y; y++) |
| r21022 | r21023 | |
| 471 | 468 | m_realpunc_bitmap->fill(0, cliprect); |
| 472 | 469 | |
| 473 | 470 | if (!(m_realpunc_video_ctrl & 0x0001)) |
| 474 | | draw_framebuffer(machine(), *m_realpunc_bitmap, cliprect, 0); |
| 471 | draw_framebuffer(*m_realpunc_bitmap, cliprect, 0); |
| 475 | 472 | |
| 476 | 473 | tc0180vcu_tilemap_draw(m_tc0180vcu, *m_realpunc_bitmap, cliprect, 2, 0); |
| 477 | 474 | |
| r21022 | r21023 | |
| 508 | 505 | tc0180vcu_set_fb_page(m_tc0180vcu, space, 0, framebuffer_page); |
| 509 | 506 | } |
| 510 | 507 | |
| 511 | | draw_sprites(machine(), *m_framebuffer[framebuffer_page], machine().primary_screen->visible_area()); |
| 508 | draw_sprites(*m_framebuffer[framebuffer_page], machine().primary_screen->visible_area()); |
| 512 | 509 | } |
| 513 | 510 | } |
trunk/src/mame/video/toaplan1.c
| r21022 | r21023 | |
| 206 | 206 | |
| 207 | 207 | ***************************************************************************/ |
| 208 | 208 | |
| 209 | | static void toaplan1_create_tilemaps(running_machine &machine) |
| 209 | void toaplan1_state::toaplan1_create_tilemaps() |
| 210 | 210 | { |
| 211 | | toaplan1_state *state = machine.driver_data<toaplan1_state>(); |
| 212 | 211 | |
| 213 | | state->m_pf1_tilemap = &machine.tilemap().create(tilemap_get_info_delegate(FUNC(toaplan1_state::get_pf1_tile_info),state), TILEMAP_SCAN_ROWS, 8, 8, 64, 64); |
| 214 | | state->m_pf2_tilemap = &machine.tilemap().create(tilemap_get_info_delegate(FUNC(toaplan1_state::get_pf2_tile_info),state), TILEMAP_SCAN_ROWS, 8, 8, 64, 64); |
| 215 | | state->m_pf3_tilemap = &machine.tilemap().create(tilemap_get_info_delegate(FUNC(toaplan1_state::get_pf3_tile_info),state), TILEMAP_SCAN_ROWS, 8, 8, 64, 64); |
| 216 | | state->m_pf4_tilemap = &machine.tilemap().create(tilemap_get_info_delegate(FUNC(toaplan1_state::get_pf4_tile_info),state), TILEMAP_SCAN_ROWS, 8, 8, 64, 64); |
| 212 | m_pf1_tilemap = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(toaplan1_state::get_pf1_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 64, 64); |
| 213 | m_pf2_tilemap = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(toaplan1_state::get_pf2_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 64, 64); |
| 214 | m_pf3_tilemap = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(toaplan1_state::get_pf3_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 64, 64); |
| 215 | m_pf4_tilemap = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(toaplan1_state::get_pf4_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 64, 64); |
| 217 | 216 | |
| 218 | | state->m_pf1_tilemap->set_transparent_pen(0); |
| 219 | | state->m_pf2_tilemap->set_transparent_pen(0); |
| 220 | | state->m_pf3_tilemap->set_transparent_pen(0); |
| 221 | | state->m_pf4_tilemap->set_transparent_pen(0); |
| 217 | m_pf1_tilemap->set_transparent_pen(0); |
| 218 | m_pf2_tilemap->set_transparent_pen(0); |
| 219 | m_pf3_tilemap->set_transparent_pen(0); |
| 220 | m_pf4_tilemap->set_transparent_pen(0); |
| 222 | 221 | |
| 223 | | memset(state->m_empty_tile, 0x00, sizeof(state->m_empty_tile)); |
| 222 | memset(m_empty_tile, 0x00, sizeof(m_empty_tile)); |
| 224 | 223 | } |
| 225 | 224 | |
| 226 | 225 | |
| 227 | | static void toaplan1_paletteram_alloc(running_machine &machine) |
| 226 | void toaplan1_state::toaplan1_paletteram_alloc() |
| 228 | 227 | { |
| 229 | | toaplan1_state *state = machine.driver_data<toaplan1_state>(); |
| 230 | 228 | |
| 231 | | UINT32 bytes = (state->m_colorram1.bytes() + state->m_colorram2.bytes())/2; |
| 232 | | state->m_generic_paletteram_16.allocate(bytes); |
| 229 | UINT32 bytes = (m_colorram1.bytes() + m_colorram2.bytes())/2; |
| 230 | m_generic_paletteram_16.allocate(bytes); |
| 233 | 231 | } |
| 234 | 232 | |
| 235 | | static void toaplan1_vram_alloc(running_machine &machine) |
| 233 | void toaplan1_state::toaplan1_vram_alloc() |
| 236 | 234 | { |
| 237 | | toaplan1_state *state = machine.driver_data<toaplan1_state>(); |
| 238 | 235 | |
| 239 | | state->m_pf1_tilevram16 = auto_alloc_array_clear(machine, UINT16, TOAPLAN1_TILEVRAM_SIZE/2); |
| 240 | | state->m_pf2_tilevram16 = auto_alloc_array_clear(machine, UINT16, TOAPLAN1_TILEVRAM_SIZE/2); |
| 241 | | state->m_pf3_tilevram16 = auto_alloc_array_clear(machine, UINT16, TOAPLAN1_TILEVRAM_SIZE/2); |
| 242 | | state->m_pf4_tilevram16 = auto_alloc_array_clear(machine, UINT16, TOAPLAN1_TILEVRAM_SIZE/2); |
| 236 | m_pf1_tilevram16 = auto_alloc_array_clear(machine(), UINT16, TOAPLAN1_TILEVRAM_SIZE/2); |
| 237 | m_pf2_tilevram16 = auto_alloc_array_clear(machine(), UINT16, TOAPLAN1_TILEVRAM_SIZE/2); |
| 238 | m_pf3_tilevram16 = auto_alloc_array_clear(machine(), UINT16, TOAPLAN1_TILEVRAM_SIZE/2); |
| 239 | m_pf4_tilevram16 = auto_alloc_array_clear(machine(), UINT16, TOAPLAN1_TILEVRAM_SIZE/2); |
| 243 | 240 | |
| 244 | | state->save_pointer(NAME(state->m_pf1_tilevram16), TOAPLAN1_TILEVRAM_SIZE/2); |
| 245 | | state->save_pointer(NAME(state->m_pf2_tilevram16), TOAPLAN1_TILEVRAM_SIZE/2); |
| 246 | | state->save_pointer(NAME(state->m_pf3_tilevram16), TOAPLAN1_TILEVRAM_SIZE/2); |
| 247 | | state->save_pointer(NAME(state->m_pf4_tilevram16), TOAPLAN1_TILEVRAM_SIZE/2); |
| 241 | save_pointer(NAME(m_pf1_tilevram16), TOAPLAN1_TILEVRAM_SIZE/2); |
| 242 | save_pointer(NAME(m_pf2_tilevram16), TOAPLAN1_TILEVRAM_SIZE/2); |
| 243 | save_pointer(NAME(m_pf3_tilevram16), TOAPLAN1_TILEVRAM_SIZE/2); |
| 244 | save_pointer(NAME(m_pf4_tilevram16), TOAPLAN1_TILEVRAM_SIZE/2); |
| 248 | 245 | |
| 249 | 246 | #ifdef MAME_DEBUG |
| 250 | | state->m_display_pf1 = 1; |
| 251 | | state->m_display_pf2 = 1; |
| 252 | | state->m_display_pf3 = 1; |
| 253 | | state->m_display_pf4 = 1; |
| 254 | | state->m_displog = 0; |
| 247 | m_display_pf1 = 1; |
| 248 | m_display_pf2 = 1; |
| 249 | m_display_pf3 = 1; |
| 250 | m_display_pf4 = 1; |
| 251 | m_displog = 0; |
| 255 | 252 | #endif |
| 256 | 253 | } |
| 257 | 254 | |
| 258 | | static void toaplan1_spritevram_alloc(running_machine &machine) |
| 255 | void toaplan1_state::toaplan1_spritevram_alloc() |
| 259 | 256 | { |
| 260 | | toaplan1_state *state = machine.driver_data<toaplan1_state>(); |
| 261 | 257 | |
| 262 | | state->m_spriteram.allocate(TOAPLAN1_SPRITERAM_SIZE/2); |
| 263 | | state->m_buffered_spriteram = auto_alloc_array_clear(machine, UINT16, TOAPLAN1_SPRITERAM_SIZE/2); |
| 264 | | state->m_spritesizeram16 = auto_alloc_array_clear(machine, UINT16, TOAPLAN1_SPRITESIZERAM_SIZE/2); |
| 265 | | state->m_buffered_spritesizeram16 = auto_alloc_array_clear(machine, UINT16, TOAPLAN1_SPRITESIZERAM_SIZE/2); |
| 258 | m_spriteram.allocate(TOAPLAN1_SPRITERAM_SIZE/2); |
| 259 | m_buffered_spriteram = auto_alloc_array_clear(machine(), UINT16, TOAPLAN1_SPRITERAM_SIZE/2); |
| 260 | m_spritesizeram16 = auto_alloc_array_clear(machine(), UINT16, TOAPLAN1_SPRITESIZERAM_SIZE/2); |
| 261 | m_buffered_spritesizeram16 = auto_alloc_array_clear(machine(), UINT16, TOAPLAN1_SPRITESIZERAM_SIZE/2); |
| 266 | 262 | |
| 267 | | state->save_pointer(NAME(state->m_buffered_spriteram), TOAPLAN1_SPRITERAM_SIZE/2); |
| 268 | | state->save_pointer(NAME(state->m_spritesizeram16), TOAPLAN1_SPRITESIZERAM_SIZE/2); |
| 269 | | state->save_pointer(NAME(state->m_buffered_spritesizeram16), TOAPLAN1_SPRITESIZERAM_SIZE/2); |
| 263 | save_pointer(NAME(m_buffered_spriteram), TOAPLAN1_SPRITERAM_SIZE/2); |
| 264 | save_pointer(NAME(m_spritesizeram16), TOAPLAN1_SPRITESIZERAM_SIZE/2); |
| 265 | save_pointer(NAME(m_buffered_spritesizeram16), TOAPLAN1_SPRITESIZERAM_SIZE/2); |
| 270 | 266 | } |
| 271 | 267 | |
| 272 | | static void toaplan1_set_scrolls(running_machine &machine) |
| 268 | void toaplan1_state::toaplan1_set_scrolls() |
| 273 | 269 | { |
| 274 | | toaplan1_state *state = machine.driver_data<toaplan1_state>(); |
| 275 | 270 | |
| 276 | | state->m_pf1_tilemap->set_scrollx(0, (state->m_pf1_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs1)); |
| 277 | | state->m_pf2_tilemap->set_scrollx(0, (state->m_pf2_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs2)); |
| 278 | | state->m_pf3_tilemap->set_scrollx(0, (state->m_pf3_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs3)); |
| 279 | | state->m_pf4_tilemap->set_scrollx(0, (state->m_pf4_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs4)); |
| 280 | | state->m_pf1_tilemap->set_scrolly(0, (state->m_pf1_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); |
| 281 | | state->m_pf2_tilemap->set_scrolly(0, (state->m_pf2_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); |
| 282 | | state->m_pf3_tilemap->set_scrolly(0, (state->m_pf3_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); |
| 283 | | state->m_pf4_tilemap->set_scrolly(0, (state->m_pf4_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); |
| 271 | m_pf1_tilemap->set_scrollx(0, (m_pf1_scrollx >> 7) - (m_tiles_offsetx - m_scrollx_offs1)); |
| 272 | m_pf2_tilemap->set_scrollx(0, (m_pf2_scrollx >> 7) - (m_tiles_offsetx - m_scrollx_offs2)); |
| 273 | m_pf3_tilemap->set_scrollx(0, (m_pf3_scrollx >> 7) - (m_tiles_offsetx - m_scrollx_offs3)); |
| 274 | m_pf4_tilemap->set_scrollx(0, (m_pf4_scrollx >> 7) - (m_tiles_offsetx - m_scrollx_offs4)); |
| 275 | m_pf1_tilemap->set_scrolly(0, (m_pf1_scrolly >> 7) - (m_tiles_offsety - m_scrolly_offs)); |
| 276 | m_pf2_tilemap->set_scrolly(0, (m_pf2_scrolly >> 7) - (m_tiles_offsety - m_scrolly_offs)); |
| 277 | m_pf3_tilemap->set_scrolly(0, (m_pf3_scrolly >> 7) - (m_tiles_offsety - m_scrolly_offs)); |
| 278 | m_pf4_tilemap->set_scrolly(0, (m_pf4_scrolly >> 7) - (m_tiles_offsety - m_scrolly_offs)); |
| 284 | 279 | } |
| 285 | 280 | |
| 286 | 281 | void toaplan1_state::rallybik_flipscreen() |
| r21022 | r21023 | |
| 297 | 292 | toaplan1_bcu_flipscreen_w(space, 0, m_bcu_flipscreen, 0xffff); |
| 298 | 293 | } |
| 299 | 294 | |
| 300 | | static void register_common(running_machine &machine) |
| 295 | void toaplan1_state::register_common() |
| 301 | 296 | { |
| 302 | | toaplan1_state *state = machine.driver_data<toaplan1_state>(); |
| 303 | 297 | |
| 304 | | state->save_item(NAME(state->m_scrollx_offs1)); |
| 305 | | state->save_item(NAME(state->m_scrollx_offs2)); |
| 306 | | state->save_item(NAME(state->m_scrollx_offs3)); |
| 307 | | state->save_item(NAME(state->m_scrollx_offs4)); |
| 308 | | state->save_item(NAME(state->m_scrolly_offs)); |
| 298 | save_item(NAME(m_scrollx_offs1)); |
| 299 | save_item(NAME(m_scrollx_offs2)); |
| 300 | save_item(NAME(m_scrollx_offs3)); |
| 301 | save_item(NAME(m_scrollx_offs4)); |
| 302 | save_item(NAME(m_scrolly_offs)); |
| 309 | 303 | |
| 310 | | state->save_item(NAME(state->m_bcu_flipscreen)); |
| 311 | | state->save_item(NAME(state->m_fcu_flipscreen)); |
| 312 | | state->save_item(NAME(state->m_reset)); |
| 304 | save_item(NAME(m_bcu_flipscreen)); |
| 305 | save_item(NAME(m_fcu_flipscreen)); |
| 306 | save_item(NAME(m_reset)); |
| 313 | 307 | |
| 314 | | state->save_item(NAME(state->m_pf1_scrollx)); |
| 315 | | state->save_item(NAME(state->m_pf1_scrolly)); |
| 316 | | state->save_item(NAME(state->m_pf2_scrollx)); |
| 317 | | state->save_item(NAME(state->m_pf2_scrolly)); |
| 318 | | state->save_item(NAME(state->m_pf3_scrollx)); |
| 319 | | state->save_item(NAME(state->m_pf3_scrolly)); |
| 320 | | state->save_item(NAME(state->m_pf4_scrollx)); |
| 321 | | state->save_item(NAME(state->m_pf4_scrolly)); |
| 308 | save_item(NAME(m_pf1_scrollx)); |
| 309 | save_item(NAME(m_pf1_scrolly)); |
| 310 | save_item(NAME(m_pf2_scrollx)); |
| 311 | save_item(NAME(m_pf2_scrolly)); |
| 312 | save_item(NAME(m_pf3_scrollx)); |
| 313 | save_item(NAME(m_pf3_scrolly)); |
| 314 | save_item(NAME(m_pf4_scrollx)); |
| 315 | save_item(NAME(m_pf4_scrolly)); |
| 322 | 316 | |
| 323 | | state->save_item(NAME(state->m_tiles_offsetx)); |
| 324 | | state->save_item(NAME(state->m_tiles_offsety)); |
| 325 | | state->save_item(NAME(state->m_pf_voffs)); |
| 326 | | state->save_item(NAME(state->m_spriteram_offs)); |
| 317 | save_item(NAME(m_tiles_offsetx)); |
| 318 | save_item(NAME(m_tiles_offsety)); |
| 319 | save_item(NAME(m_pf_voffs)); |
| 320 | save_item(NAME(m_spriteram_offs)); |
| 327 | 321 | } |
| 328 | 322 | |
| 329 | 323 | |
| 330 | 324 | VIDEO_START_MEMBER(toaplan1_state,rallybik) |
| 331 | 325 | { |
| 332 | | toaplan1_create_tilemaps(machine()); |
| 333 | | toaplan1_paletteram_alloc(machine()); |
| 334 | | toaplan1_vram_alloc(machine()); |
| 326 | toaplan1_create_tilemaps(); |
| 327 | toaplan1_paletteram_alloc(); |
| 328 | toaplan1_vram_alloc(); |
| 335 | 329 | |
| 336 | 330 | m_buffered_spriteram = auto_alloc_array_clear(machine(), UINT16, m_spriteram.bytes()/2); |
| 337 | 331 | save_pointer(NAME(m_buffered_spriteram), m_spriteram.bytes()/2); |
| r21022 | r21023 | |
| 346 | 340 | m_fcu_flipscreen = 0; |
| 347 | 341 | m_reset = 0; |
| 348 | 342 | |
| 349 | | register_common(machine()); |
| 343 | register_common(); |
| 350 | 344 | |
| 351 | 345 | machine().save().register_postload(save_prepost_delegate(FUNC(toaplan1_state::rallybik_flipscreen), this)); |
| 352 | 346 | } |
| 353 | 347 | |
| 354 | 348 | VIDEO_START_MEMBER(toaplan1_state,toaplan1) |
| 355 | 349 | { |
| 356 | | toaplan1_create_tilemaps(machine()); |
| 357 | | toaplan1_paletteram_alloc(machine()); |
| 358 | | toaplan1_vram_alloc(machine()); |
| 359 | | toaplan1_spritevram_alloc(machine()); |
| 350 | toaplan1_create_tilemaps(); |
| 351 | toaplan1_paletteram_alloc(); |
| 352 | toaplan1_vram_alloc(); |
| 353 | toaplan1_spritevram_alloc(); |
| 360 | 354 | |
| 361 | 355 | m_scrollx_offs1 = 0x1ef + 6; |
| 362 | 356 | m_scrollx_offs2 = 0x1ef + 4; |
| r21022 | r21023 | |
| 368 | 362 | m_fcu_flipscreen = 0; |
| 369 | 363 | m_reset = 1; |
| 370 | 364 | |
| 371 | | register_common(machine()); |
| 365 | register_common(); |
| 372 | 366 | |
| 373 | 367 | machine().save().register_postload(save_prepost_delegate(FUNC(toaplan1_state::toaplan1_flipscreen), this)); |
| 374 | 368 | } |
| r21022 | r21023 | |
| 398 | 392 | logerror("Tiles_offsety now = %08x\n", m_tiles_offsety); |
| 399 | 393 | } |
| 400 | 394 | m_reset = 1; |
| 401 | | toaplan1_set_scrolls(machine()); |
| 395 | toaplan1_set_scrolls(); |
| 402 | 396 | } |
| 403 | 397 | |
| 404 | 398 | WRITE16_MEMBER(toaplan1_state::rallybik_bcu_flipscreen_w) |
| r21022 | r21023 | |
| 424 | 418 | m_scrollx_offs4 = 0x00d + 0; |
| 425 | 419 | m_scrolly_offs = 0x111; |
| 426 | 420 | } |
| 427 | | toaplan1_set_scrolls(machine()); |
| 421 | toaplan1_set_scrolls(); |
| 428 | 422 | } |
| 429 | 423 | } |
| 430 | 424 | |
| r21022 | r21023 | |
| 454 | 448 | m_scrollx_offs4 = 0x1ef + 0; |
| 455 | 449 | m_scrolly_offs = 0x101; |
| 456 | 450 | } |
| 457 | | toaplan1_set_scrolls(machine()); |
| 451 | toaplan1_set_scrolls(); |
| 458 | 452 | } |
| 459 | 453 | } |
| 460 | 454 | |
| r21022 | r21023 | |
| 706 | 700 | |
| 707 | 701 | |
| 708 | 702 | |
| 709 | | static void toaplan1_log_vram(running_machine &machine) |
| 703 | void toaplan1_state::toaplan1_log_vram() |
| 710 | 704 | { |
| 711 | 705 | #ifdef MAME_DEBUG |
| 712 | | toaplan1_state *state = machine.driver_data<toaplan1_state>(); |
| 713 | 706 | |
| 714 | | if ( machine.input().code_pressed(KEYCODE_M) ) |
| 707 | if ( machine().input().code_pressed(KEYCODE_M) ) |
| 715 | 708 | { |
| 716 | | UINT16 *spriteram16 = state->m_spriteram; |
| 717 | | UINT16 *buffered_spriteram16 = state->m_buffered_spriteram; |
| 709 | UINT16 *spriteram16 = m_spriteram; |
| 710 | UINT16 *buffered_spriteram16 = m_buffered_spriteram; |
| 718 | 711 | offs_t sprite_voffs; |
| 719 | | while (machine.input().code_pressed(KEYCODE_M)) ; |
| 720 | | if (state->m_spritesizeram16) /* FCU controller */ |
| 712 | while (machine().input().code_pressed(KEYCODE_M)) ; |
| 713 | if (m_spritesizeram16) /* FCU controller */ |
| 721 | 714 | { |
| 722 | 715 | int schar,sattr,sxpos,sypos,bschar,bsattr,bsxpos,bsypos; |
| 723 | | UINT16 *size = (UINT16 *)(state->m_spritesizeram16); |
| 724 | | UINT16 *bsize = (UINT16 *)(state->m_buffered_spritesizeram16); |
| 716 | UINT16 *size = (UINT16 *)(m_spritesizeram16); |
| 717 | UINT16 *bsize = (UINT16 *)(m_buffered_spritesizeram16); |
| 725 | 718 | logerror("Scrolls PF1-X PF1-Y PF2-X PF2-Y PF3-X PF3-Y PF4-X PF4-Y\n"); |
| 726 | 719 | logerror("------> #%04x #%04x #%04x #%04x #%04x #%04x #%04x #%04x\n", |
| 727 | | state->m_pf1_scrollx, state->m_pf1_scrolly, state->m_pf2_scrollx, state->m_pf2_scrolly, state->m_pf3_scrollx, state->m_pf3_scrolly, state->m_pf4_scrollx, state->m_pf4_scrolly); |
| 728 | | for ( sprite_voffs = 0; sprite_voffs < state->m_spriteram.bytes()/2; sprite_voffs += 4 ) |
| 720 | m_pf1_scrollx, m_pf1_scrolly, m_pf2_scrollx, m_pf2_scrolly, m_pf3_scrollx, m_pf3_scrolly, m_pf4_scrollx, m_pf4_scrolly); |
| 721 | for ( sprite_voffs = 0; sprite_voffs < m_spriteram.bytes()/2; sprite_voffs += 4 ) |
| 729 | 722 | { |
| 730 | 723 | bschar = buffered_spriteram16[sprite_voffs]; |
| 731 | 724 | bsattr = buffered_spriteram16[sprite_voffs + 1]; |
| r21022 | r21023 | |
| 745 | 738 | int schar,sattr,sxpos,sypos,bschar,bsattr,bsxpos,bsypos; |
| 746 | 739 | logerror("Scrolls PF1-X PF1-Y PF2-X PF2-Y PF3-X PF3-Y PF4-X PF4-Y\n"); |
| 747 | 740 | logerror("------> #%04x #%04x #%04x #%04x #%04x #%04x #%04x #%04x\n", |
| 748 | | state->m_pf1_scrollx, state->m_pf1_scrolly, state->m_pf2_scrollx, state->m_pf2_scrolly, state->m_pf3_scrollx, state->m_pf3_scrolly, state->m_pf4_scrollx, state->m_pf4_scrolly); |
| 749 | | for ( sprite_voffs = 0; sprite_voffs < state->m_spriteram.bytes()/2; sprite_voffs += 4 ) |
| 741 | m_pf1_scrollx, m_pf1_scrolly, m_pf2_scrollx, m_pf2_scrolly, m_pf3_scrollx, m_pf3_scrolly, m_pf4_scrollx, m_pf4_scrolly); |
| 742 | for ( sprite_voffs = 0; sprite_voffs < m_spriteram.bytes()/2; sprite_voffs += 4 ) |
| 750 | 743 | { |
| 751 | 744 | bschar = buffered_spriteram16[sprite_voffs]; |
| 752 | 745 | bsattr = buffered_spriteram16[sprite_voffs + 1]; |
| r21022 | r21023 | |
| 763 | 756 | } |
| 764 | 757 | } |
| 765 | 758 | |
| 766 | | if ( machine.input().code_pressed(KEYCODE_SLASH) ) |
| 759 | if ( machine().input().code_pressed(KEYCODE_SLASH) ) |
| 767 | 760 | { |
| 768 | | UINT16 *size = (UINT16 *)(state->m_spritesizeram16); |
| 769 | | UINT16 *bsize = (UINT16 *)(state->m_buffered_spritesizeram16); |
| 761 | UINT16 *size = (UINT16 *)(m_spritesizeram16); |
| 762 | UINT16 *bsize = (UINT16 *)(m_buffered_spritesizeram16); |
| 770 | 763 | offs_t offs; |
| 771 | | while (machine.input().code_pressed(KEYCODE_SLASH)) ; |
| 772 | | if (state->m_spritesizeram16) /* FCU controller */ |
| 764 | while (machine().input().code_pressed(KEYCODE_SLASH)) ; |
| 765 | if (m_spritesizeram16) /* FCU controller */ |
| 773 | 766 | { |
| 774 | 767 | logerror("Scrolls PF1-X PF1-Y PF2-X PF2-Y PF3-X PF3-Y PF4-X PF4-Y\n"); |
| 775 | 768 | logerror("------> #%04x #%04x #%04x #%04x #%04x #%04x #%04x #%04x\n", |
| 776 | | state->m_pf1_scrollx, state->m_pf1_scrolly, state->m_pf2_scrollx, state->m_pf2_scrolly, state->m_pf3_scrollx, state->m_pf3_scrolly, state->m_pf4_scrollx, state->m_pf4_scrolly); |
| 769 | m_pf1_scrollx, m_pf1_scrolly, m_pf2_scrollx, m_pf2_scrolly, m_pf3_scrollx, m_pf3_scrolly, m_pf4_scrollx, m_pf4_scrolly); |
| 777 | 770 | for ( offs = 0; offs < (TOAPLAN1_SPRITESIZERAM_SIZE/2); offs +=4 ) |
| 778 | 771 | { |
| 779 | 772 | logerror("SizeOffs:%04x now:%04x %04x %04x %04x next: %04x %04x %04x %04x\n", offs, |
| r21022 | r21023 | |
| 785 | 778 | } |
| 786 | 779 | } |
| 787 | 780 | |
| 788 | | if ( machine.input().code_pressed(KEYCODE_N) ) |
| 781 | if ( machine().input().code_pressed(KEYCODE_N) ) |
| 789 | 782 | { |
| 790 | 783 | offs_t tile_voffs; |
| 791 | 784 | int tchar[5], tattr[5]; |
| 792 | | while (machine.input().code_pressed(KEYCODE_N)) ; /* BCU controller */ |
| 785 | while (machine().input().code_pressed(KEYCODE_N)) ; /* BCU controller */ |
| 793 | 786 | logerror("Scrolls PF1-X PF1-Y PF2-X PF2-Y PF3-X PF3-Y PF4-X PF4-Y\n"); |
| 794 | 787 | logerror("------> #%04x #%04x #%04x #%04x #%04x #%04x #%04x #%04x\n", |
| 795 | | state->m_pf1_scrollx, state->m_pf1_scrolly, state->m_pf2_scrollx, state->m_pf2_scrolly, state->m_pf3_scrollx, state->m_pf3_scrolly, state->m_pf4_scrollx, state->m_pf4_scrolly); |
| 788 | m_pf1_scrollx, m_pf1_scrolly, m_pf2_scrollx, m_pf2_scrolly, m_pf3_scrollx, m_pf3_scrolly, m_pf4_scrollx, m_pf4_scrolly); |
| 796 | 789 | for ( tile_voffs = 0; tile_voffs < (TOAPLAN1_TILEVRAM_SIZE/2); tile_voffs += 2 ) |
| 797 | 790 | { |
| 798 | | tchar[1] = state->m_pf1_tilevram16[tile_voffs + 1]; |
| 799 | | tattr[1] = state->m_pf1_tilevram16[tile_voffs]; |
| 800 | | tchar[2] = state->m_pf2_tilevram16[tile_voffs + 1]; |
| 801 | | tattr[2] = state->m_pf2_tilevram16[tile_voffs]; |
| 802 | | tchar[3] = state->m_pf3_tilevram16[tile_voffs + 1]; |
| 803 | | tattr[3] = state->m_pf3_tilevram16[tile_voffs]; |
| 804 | | tchar[4] = state->m_pf4_tilevram16[tile_voffs + 1]; |
| 805 | | tattr[4] = state->m_pf4_tilevram16[tile_voffs]; |
| 791 | tchar[1] = m_pf1_tilevram16[tile_voffs + 1]; |
| 792 | tattr[1] = m_pf1_tilevram16[tile_voffs]; |
| 793 | tchar[2] = m_pf2_tilevram16[tile_voffs + 1]; |
| 794 | tattr[2] = m_pf2_tilevram16[tile_voffs]; |
| 795 | tchar[3] = m_pf3_tilevram16[tile_voffs + 1]; |
| 796 | tattr[3] = m_pf3_tilevram16[tile_voffs]; |
| 797 | tchar[4] = m_pf4_tilevram16[tile_voffs + 1]; |
| 798 | tattr[4] = m_pf4_tilevram16[tile_voffs]; |
| 806 | 799 | // logerror("PF3 offs:%04x Tile:%04x Attr:%04x\n", tile_voffs, tchar, tattr); |
| 807 | 800 | logerror("$(%04x) Attr-Tile PF1:%04x-%04x PF2:%04x-%04x PF3:%04x-%04x PF4:%04x-%04x\n", tile_voffs, |
| 808 | 801 | tattr[1], tchar[1], tattr[2], tchar[2], |
| r21022 | r21023 | |
| 810 | 803 | } |
| 811 | 804 | } |
| 812 | 805 | |
| 813 | | if ( machine.input().code_pressed(KEYCODE_W) ) |
| 806 | if ( machine().input().code_pressed(KEYCODE_W) ) |
| 814 | 807 | { |
| 815 | | while (machine.input().code_pressed(KEYCODE_W)) ; |
| 808 | while (machine().input().code_pressed(KEYCODE_W)) ; |
| 816 | 809 | logerror("Mark here\n"); |
| 817 | 810 | } |
| 818 | | if ( machine.input().code_pressed(KEYCODE_E) ) |
| 811 | if ( machine().input().code_pressed(KEYCODE_E) ) |
| 819 | 812 | { |
| 820 | | while (machine.input().code_pressed(KEYCODE_E)) ; |
| 821 | | state->m_displog += 1; |
| 822 | | state->m_displog &= 1; |
| 813 | while (machine().input().code_pressed(KEYCODE_E)) ; |
| 814 | m_displog += 1; |
| 815 | m_displog &= 1; |
| 823 | 816 | } |
| 824 | | if (state->m_displog) |
| 817 | if (m_displog) |
| 825 | 818 | { |
| 826 | 819 | logerror("Scrolls PF1-X PF1-Y PF2-X PF2-Y PF3-X PF3-Y PF4-X PF4-Y\n"); |
| 827 | 820 | logerror("------> #%04x #%04x #%04x #%04x #%04x #%04x #%04x #%04x\n", |
| 828 | | state->m_pf1_scrollx, state->m_pf1_scrolly, state->m_pf2_scrollx, state->m_pf2_scrolly, state->m_pf3_scrollx, state->m_pf3_scrolly, state->m_pf4_scrollx, state->m_pf4_scrolly); |
| 821 | m_pf1_scrollx, m_pf1_scrolly, m_pf2_scrollx, m_pf2_scrolly, m_pf3_scrollx, m_pf3_scrolly, m_pf4_scrollx, m_pf4_scrolly); |
| 829 | 822 | } |
| 830 | | if ( machine.input().code_pressed(KEYCODE_B) ) |
| 823 | if ( machine().input().code_pressed(KEYCODE_B) ) |
| 831 | 824 | { |
| 832 | | // while (machine.input().code_pressed(KEYCODE_B)) ; |
| 833 | | state->m_scrollx_offs1 += 0x1; state->m_scrollx_offs2 += 0x1; state->m_scrollx_offs3 += 0x1; state->m_scrollx_offs4 += 0x1; |
| 834 | | logerror("Scrollx_offs now = %08x\n", state->m_scrollx_offs4); |
| 835 | | state->m_pf1_tilemap->set_scrollx(0, (state->m_pf1_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs1)); |
| 836 | | state->m_pf2_tilemap->set_scrollx(0, (state->m_pf2_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs2)); |
| 837 | | state->m_pf3_tilemap->set_scrollx(0, (state->m_pf3_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs3)); |
| 838 | | state->m_pf4_tilemap->set_scrollx(0, (state->m_pf4_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs4)); |
| 825 | // while (machine().input().code_pressed(KEYCODE_B)) ; |
| 826 | m_scrollx_offs1 += 0x1; m_scrollx_offs2 += 0x1; m_scrollx_offs3 += 0x1; m_scrollx_offs4 += 0x1; |
| 827 | logerror("Scrollx_offs now = %08x\n", m_scrollx_offs4); |
| 828 | m_pf1_tilemap->set_scrollx(0, (m_pf1_scrollx >> 7) - (m_tiles_offsetx - m_scrollx_offs1)); |
| 829 | m_pf2_tilemap->set_scrollx(0, (m_pf2_scrollx >> 7) - (m_tiles_offsetx - m_scrollx_offs2)); |
| 830 | m_pf3_tilemap->set_scrollx(0, (m_pf3_scrollx >> 7) - (m_tiles_offsetx - m_scrollx_offs3)); |
| 831 | m_pf4_tilemap->set_scrollx(0, (m_pf4_scrollx >> 7) - (m_tiles_offsetx - m_scrollx_offs4)); |
| 839 | 832 | } |
| 840 | | if ( machine.input().code_pressed(KEYCODE_V) ) |
| 833 | if ( machine().input().code_pressed(KEYCODE_V) ) |
| 841 | 834 | { |
| 842 | | // while (machine.input().code_pressed(KEYCODE_V)) ; |
| 843 | | state->m_scrollx_offs1 -= 0x1; state->m_scrollx_offs2 -= 0x1; state->m_scrollx_offs3 -= 0x1; state->m_scrollx_offs4 -= 0x1; |
| 844 | | logerror("Scrollx_offs now = %08x\n", state->m_scrollx_offs4); |
| 845 | | state->m_pf1_tilemap->set_scrollx(0, (state->m_pf1_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs1)); |
| 846 | | state->m_pf2_tilemap->set_scrollx(0, (state->m_pf2_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs2)); |
| 847 | | state->m_pf3_tilemap->set_scrollx(0, (state->m_pf3_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs3)); |
| 848 | | state->m_pf4_tilemap->set_scrollx(0, (state->m_pf4_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs4)); |
| 835 | // while (machine().input().code_pressed(KEYCODE_V)) ; |
| 836 | m_scrollx_offs1 -= 0x1; m_scrollx_offs2 -= 0x1; m_scrollx_offs3 -= 0x1; m_scrollx_offs4 -= 0x1; |
| 837 | logerror("Scrollx_offs now = %08x\n", m_scrollx_offs4); |
| 838 | m_pf1_tilemap->set_scrollx(0, (m_pf1_scrollx >> 7) - (m_tiles_offsetx - m_scrollx_offs1)); |
| 839 | m_pf2_tilemap->set_scrollx(0, (m_pf2_scrollx >> 7) - (m_tiles_offsetx - m_scrollx_offs2)); |
| 840 | m_pf3_tilemap->set_scrollx(0, (m_pf3_scrollx >> 7) - (m_tiles_offsetx - m_scrollx_offs3)); |
| 841 | m_pf4_tilemap->set_scrollx(0, (m_pf4_scrollx >> 7) - (m_tiles_offsetx - m_scrollx_offs4)); |
| 849 | 842 | } |
| 850 | | if ( machine.input().code_pressed(KEYCODE_C) ) |
| 843 | if ( machine().input().code_pressed(KEYCODE_C) ) |
| 851 | 844 | { |
| 852 | | // while (machine.input().code_pressed(KEYCODE_C)) ; |
| 853 | | state->m_scrolly_offs += 0x1; |
| 854 | | logerror("Scrolly_offs now = %08x\n", state->m_scrolly_offs); |
| 855 | | state->m_pf1_tilemap->set_scrolly(0, (state->m_pf1_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); |
| 856 | | state->m_pf2_tilemap->set_scrolly(0, (state->m_pf2_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); |
| 857 | | state->m_pf3_tilemap->set_scrolly(0, (state->m_pf3_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); |
| 858 | | state->m_pf4_tilemap->set_scrolly(0, (state->m_pf4_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); |
| 845 | // while (machine().input().code_pressed(KEYCODE_C)) ; |
| 846 | m_scrolly_offs += 0x1; |
| 847 | logerror("Scrolly_offs now = %08x\n", m_scrolly_offs); |
| 848 | m_pf1_tilemap->set_scrolly(0, (m_pf1_scrolly >> 7) - (m_tiles_offsety - m_scrolly_offs)); |
| 849 | m_pf2_tilemap->set_scrolly(0, (m_pf2_scrolly >> 7) - (m_tiles_offsety - m_scrolly_offs)); |
| 850 | m_pf3_tilemap->set_scrolly(0, (m_pf3_scrolly >> 7) - (m_tiles_offsety - m_scrolly_offs)); |
| 851 | m_pf4_tilemap->set_scrolly(0, (m_pf4_scrolly >> 7) - (m_tiles_offsety - m_scrolly_offs)); |
| 859 | 852 | } |
| 860 | | if ( machine.input().code_pressed(KEYCODE_X) ) |
| 853 | if ( machine().input().code_pressed(KEYCODE_X) ) |
| 861 | 854 | { |
| 862 | | // while (machine.input().code_pressed(KEYCODE_X)) ; |
| 863 | | state->m_scrolly_offs -= 0x1; |
| 864 | | logerror("Scrolly_offs now = %08x\n", state->m_scrolly_offs); |
| 865 | | state->m_pf1_tilemap->set_scrolly(0, (state->m_pf1_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); |
| 866 | | state->m_pf2_tilemap->set_scrolly(0, (state->m_pf2_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); |
| 867 | | state->m_pf3_tilemap->set_scrolly(0, (state->m_pf3_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); |
| 868 | | state->m_pf4_tilemap->set_scrolly(0, (state->m_pf4_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); |
| 855 | // while (machine().input().code_pressed(KEYCODE_X)) ; |
| 856 | m_scrolly_offs -= 0x1; |
| 857 | logerror("Scrolly_offs now = %08x\n", m_scrolly_offs); |
| 858 | m_pf1_tilemap->set_scrolly(0, (m_pf1_scrolly >> 7) - (m_tiles_offsety - m_scrolly_offs)); |
| 859 | m_pf2_tilemap->set_scrolly(0, (m_pf2_scrolly >> 7) - (m_tiles_offsety - m_scrolly_offs)); |
| 860 | m_pf3_tilemap->set_scrolly(0, (m_pf3_scrolly >> 7) - (m_tiles_offsety - m_scrolly_offs)); |
| 861 | m_pf4_tilemap->set_scrolly(0, (m_pf4_scrolly >> 7) - (m_tiles_offsety - m_scrolly_offs)); |
| 869 | 862 | } |
| 870 | 863 | |
| 871 | | if ( machine.input().code_pressed(KEYCODE_L) ) /* Turn Playfield 4 on/off */ |
| 864 | if ( machine().input().code_pressed(KEYCODE_L) ) /* Turn Playfield 4 on/off */ |
| 872 | 865 | { |
| 873 | | while (machine.input().code_pressed(KEYCODE_L)) ; |
| 874 | | state->m_display_pf4 += 1; |
| 875 | | state->m_display_pf4 &= 1; |
| 876 | | state->m_pf4_tilemap->enable(state->m_display_pf4); |
| 866 | while (machine().input().code_pressed(KEYCODE_L)) ; |
| 867 | m_display_pf4 += 1; |
| 868 | m_display_pf4 &= 1; |
| 869 | m_pf4_tilemap->enable(m_display_pf4); |
| 877 | 870 | } |
| 878 | | if ( machine.input().code_pressed(KEYCODE_K) ) /* Turn Playfield 3 on/off */ |
| 871 | if ( machine().input().code_pressed(KEYCODE_K) ) /* Turn Playfield 3 on/off */ |
| 879 | 872 | { |
| 880 | | while (machine.input().code_pressed(KEYCODE_K)) ; |
| 881 | | state->m_display_pf3 += 1; |
| 882 | | state->m_display_pf3 &= 1; |
| 883 | | state->m_pf3_tilemap->enable(state->m_display_pf3); |
| 873 | while (machine().input().code_pressed(KEYCODE_K)) ; |
| 874 | m_display_pf3 += 1; |
| 875 | m_display_pf3 &= 1; |
| 876 | m_pf3_tilemap->enable(m_display_pf3); |
| 884 | 877 | } |
| 885 | | if ( machine.input().code_pressed(KEYCODE_J) ) /* Turn Playfield 2 on/off */ |
| 878 | if ( machine().input().code_pressed(KEYCODE_J) ) /* Turn Playfield 2 on/off */ |
| 886 | 879 | { |
| 887 | | while (machine.input().code_pressed(KEYCODE_J)) ; |
| 888 | | state->m_display_pf2 += 1; |
| 889 | | state->m_display_pf2 &= 1; |
| 890 | | state->m_pf2_tilemap->enable(state->m_display_pf2); |
| 880 | while (machine().input().code_pressed(KEYCODE_J)) ; |
| 881 | m_display_pf2 += 1; |
| 882 | m_display_pf2 &= 1; |
| 883 | m_pf2_tilemap->enable(m_display_pf2); |
| 891 | 884 | } |
| 892 | | if ( machine.input().code_pressed(KEYCODE_H) ) /* Turn Playfield 1 on/off */ |
| 885 | if ( machine().input().code_pressed(KEYCODE_H) ) /* Turn Playfield 1 on/off */ |
| 893 | 886 | { |
| 894 | | while (machine.input().code_pressed(KEYCODE_H)) ; |
| 895 | | state->m_display_pf1 += 1; |
| 896 | | state->m_display_pf1 &= 1; |
| 897 | | state->m_pf1_tilemap->enable(state->m_display_pf1); |
| 887 | while (machine().input().code_pressed(KEYCODE_H)) ; |
| 888 | m_display_pf1 += 1; |
| 889 | m_display_pf1 &= 1; |
| 890 | m_pf1_tilemap->enable(m_display_pf1); |
| 898 | 891 | } |
| 899 | 892 | #endif |
| 900 | 893 | } |
| r21022 | r21023 | |
| 1002 | 995 | } |
| 1003 | 996 | |
| 1004 | 997 | |
| 1005 | | static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) |
| 998 | void toaplan1_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect ) |
| 1006 | 999 | { |
| 1007 | | toaplan1_state *state = machine.driver_data<toaplan1_state>(); |
| 1008 | | UINT16 *source = (UINT16 *)state->m_buffered_spriteram; |
| 1009 | | UINT16 *size = (UINT16 *)state->m_buffered_spritesizeram16; |
| 1010 | | int fcu_flipscreen = state->m_fcu_flipscreen; |
| 1000 | UINT16 *source = (UINT16 *)m_buffered_spriteram; |
| 1001 | UINT16 *size = (UINT16 *)m_buffered_spritesizeram16; |
| 1002 | int fcu_flipscreen = m_fcu_flipscreen; |
| 1011 | 1003 | int offs; |
| 1012 | 1004 | |
| 1013 | | for (offs = state->m_spriteram.bytes()/2 - 4; offs >= 0; offs -= 4) |
| 1005 | for (offs = m_spriteram.bytes()/2 - 4; offs >= 0; offs -= 4) |
| 1014 | 1006 | { |
| 1015 | 1007 | if (!(source[offs] & 0x8000)) |
| 1016 | 1008 | { |
| r21022 | r21023 | |
| 1039 | 1031 | /****** flip the sprite layer ******/ |
| 1040 | 1032 | if (fcu_flipscreen) |
| 1041 | 1033 | { |
| 1042 | | const rectangle &visarea = machine.primary_screen->visible_area(); |
| 1034 | const rectangle &visarea = machine().primary_screen->visible_area(); |
| 1043 | 1035 | |
| 1044 | 1036 | sx_base = visarea.width() - (sx_base + 8); /* visarea.x = 320 */ |
| 1045 | 1037 | sy_base = visarea.height() - (sy_base + 8); /* visarea.y = 240 */ |
| r21022 | r21023 | |
| 1056 | 1048 | if (fcu_flipscreen) sx = sx_base - dim_x; |
| 1057 | 1049 | else sx = sx_base + dim_x; |
| 1058 | 1050 | |
| 1059 | | toaplan1_draw_sprite_custom(bitmap,cliprect,machine.gfx[1], |
| 1051 | toaplan1_draw_sprite_custom(bitmap,cliprect,machine().gfx[1], |
| 1060 | 1052 | sprite,color, |
| 1061 | 1053 | fcu_flipscreen,fcu_flipscreen, |
| 1062 | 1054 | sx,sy, |
| r21022 | r21023 | |
| 1070 | 1062 | } |
| 1071 | 1063 | |
| 1072 | 1064 | |
| 1073 | | static void rallybik_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority ) |
| 1065 | void toaplan1_state::rallybik_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, int priority ) |
| 1074 | 1066 | { |
| 1075 | | toaplan1_state *state = machine.driver_data<toaplan1_state>(); |
| 1076 | | UINT16 *buffered_spriteram16 = state->m_buffered_spriteram; |
| 1067 | UINT16 *buffered_spriteram16 = m_buffered_spriteram; |
| 1077 | 1068 | int offs; |
| 1078 | 1069 | |
| 1079 | | for (offs = 0; offs < state->m_spriteram.bytes()/2; offs += 4) |
| 1070 | for (offs = 0; offs < m_spriteram.bytes()/2; offs += 4) |
| 1080 | 1071 | { |
| 1081 | 1072 | int attrib, sx, sy, flipx, flipy; |
| 1082 | 1073 | int sprite, color; |
| r21022 | r21023 | |
| 1093 | 1084 | flipx = attrib & 0x100; |
| 1094 | 1085 | if (flipx) sx -= 15; |
| 1095 | 1086 | flipy = attrib & 0x200; |
| 1096 | | drawgfx_transpen(bitmap,cliprect,machine.gfx[1], |
| 1087 | drawgfx_transpen(bitmap,cliprect,machine().gfx[1], |
| 1097 | 1088 | sprite, |
| 1098 | 1089 | color, |
| 1099 | 1090 | flipx,flipy, |
| r21022 | r21023 | |
| 1112 | 1103 | { |
| 1113 | 1104 | int priority; |
| 1114 | 1105 | |
| 1115 | | toaplan1_log_vram(machine()); |
| 1106 | toaplan1_log_vram(); |
| 1116 | 1107 | |
| 1117 | 1108 | bitmap.fill(0x120, cliprect); |
| 1118 | 1109 | |
| r21022 | r21023 | |
| 1125 | 1116 | m_pf3_tilemap->draw(bitmap, cliprect, priority, 0); |
| 1126 | 1117 | m_pf2_tilemap->draw(bitmap, cliprect, priority, 0); |
| 1127 | 1118 | m_pf1_tilemap->draw(bitmap, cliprect, priority, 0); |
| 1128 | | rallybik_draw_sprites(machine(), bitmap,cliprect,priority << 8); |
| 1119 | rallybik_draw_sprites(bitmap,cliprect,priority << 8); |
| 1129 | 1120 | } |
| 1130 | 1121 | |
| 1131 | 1122 | return 0; |
| r21022 | r21023 | |
| 1135 | 1126 | { |
| 1136 | 1127 | int priority; |
| 1137 | 1128 | |
| 1138 | | toaplan1_log_vram(machine()); |
| 1129 | toaplan1_log_vram(); |
| 1139 | 1130 | |
| 1140 | 1131 | machine().priority_bitmap.fill(0, cliprect); |
| 1141 | 1132 | bitmap.fill(0x120, cliprect); |
| r21022 | r21023 | |
| 1152 | 1143 | m_pf1_tilemap->draw(bitmap, cliprect, priority, priority, 0); |
| 1153 | 1144 | } |
| 1154 | 1145 | |
| 1155 | | draw_sprites(machine(), bitmap, cliprect); |
| 1146 | draw_sprites(bitmap, cliprect); |
| 1156 | 1147 | return 0; |
| 1157 | 1148 | } |
| 1158 | 1149 | |
trunk/src/mame/drivers/taito_l.c
| r21022 | r21023 | |
| 65 | 65 | |
| 66 | 66 | static const struct |
| 67 | 67 | { |
| 68 | | void (*notifier)(running_machine &, int); |
| 68 | void (taitol_state::*notifier)(int); |
| 69 | 69 | UINT32 offset; |
| 70 | 70 | } rambank_modify_notifiers[12] = |
| 71 | 71 | { |
| 72 | | { taitol_chardef14_m, 0x0000 }, // 14 |
| 73 | | { taitol_chardef15_m, 0x1000 }, // 15 |
| 74 | | { taitol_chardef16_m, 0x2000 }, // 16 |
| 75 | | { taitol_chardef17_m, 0x3000 }, // 17 |
| 72 | { &taitol_state::taitol_chardef14_m, 0x0000 }, // 14 |
| 73 | { &taitol_state::taitol_chardef15_m, 0x1000 }, // 15 |
| 74 | { &taitol_state::taitol_chardef16_m, 0x2000 }, // 16 |
| 75 | { &taitol_state::taitol_chardef17_m, 0x3000 }, // 17 |
| 76 | 76 | |
| 77 | | { taitol_bg18_m, 0x8000 }, // 18 |
| 78 | | { taitol_bg19_m, 0x9000 }, // 19 |
| 79 | | { taitol_char1a_m, 0xa000 }, // 1a |
| 80 | | { taitol_obj1b_m, 0xb000 }, // 1b |
| 77 | { &taitol_state::taitol_bg18_m, 0x8000 }, // 18 |
| 78 | { &taitol_state::taitol_bg19_m, 0x9000 }, // 19 |
| 79 | { &taitol_state::taitol_char1a_m, 0xa000 }, // 1a |
| 80 | { &taitol_state::taitol_obj1b_m, 0xb000 }, // 1b |
| 81 | 81 | |
| 82 | | { taitol_chardef1c_m, 0x4000 }, // 1c |
| 83 | | { taitol_chardef1d_m, 0x5000 }, // 1d |
| 84 | | { taitol_chardef1e_m, 0x6000 }, // 1e |
| 85 | | { taitol_chardef1f_m, 0x7000 }, // 1f |
| 82 | { &taitol_state::taitol_chardef1c_m, 0x4000 }, // 1c |
| 83 | { &taitol_state::taitol_chardef1d_m, 0x5000 }, // 1d |
| 84 | { &taitol_state::taitol_chardef1e_m, 0x6000 }, // 1e |
| 85 | { &taitol_state::taitol_chardef1f_m, 0x7000 }, // 1f |
| 86 | 86 | }; |
| 87 | 87 | |
| 88 | 88 | |
| 89 | | static void palette_notifier(running_machine &machine, int addr) |
| 89 | void taitol_state::palette_notifier(int addr) |
| 90 | 90 | { |
| 91 | | taitol_state *state = machine.driver_data<taitol_state>(); |
| 92 | | UINT8 *p = state->m_palette_ram + (addr & ~1); |
| 91 | UINT8 *p = m_palette_ram + (addr & ~1); |
| 93 | 92 | UINT8 byte0 = *p++; |
| 94 | 93 | UINT8 byte1 = *p; |
| 95 | 94 | |
| r21022 | r21023 | |
| 97 | 96 | |
| 98 | 97 | if (addr > 0x200) |
| 99 | 98 | { |
| 100 | | logerror("%s:Large palette ? %03x\n", machine.describe_context(), addr); |
| 99 | logerror("%s:Large palette ? %03x\n", machine().describe_context(), addr); |
| 101 | 100 | } |
| 102 | 101 | else |
| 103 | 102 | { |
| 104 | 103 | // r = g = b = ((addr & 0x1e) != 0)*255; |
| 105 | | palette_set_color_rgb(machine, addr / 2, pal4bit(byte0), pal4bit(byte0 >> 4), pal4bit(byte1)); |
| 104 | palette_set_color_rgb(machine(), addr / 2, pal4bit(byte0), pal4bit(byte0 >> 4), pal4bit(byte1)); |
| 106 | 105 | } |
| 107 | 106 | } |
| 108 | 107 | |
| 109 | 108 | static const UINT8 puzznic_mcu_reply[] = { 0x50, 0x1f, 0xb6, 0xba, 0x06, 0x03, 0x47, 0x05, 0x00 }; |
| 110 | 109 | |
| 111 | | static void state_register( running_machine &machine ) |
| 110 | void taitol_state::state_register( ) |
| 112 | 111 | { |
| 113 | | taitol_state *state = machine.driver_data<taitol_state>(); |
| 114 | 112 | |
| 115 | | state->save_item(NAME(state->m_irq_adr_table)); |
| 116 | | state->save_item(NAME(state->m_irq_enable)); |
| 117 | | state->save_item(NAME(state->m_cur_rambank)); |
| 118 | | state->save_item(NAME(state->m_cur_rombank)); |
| 119 | | state->save_item(NAME(state->m_cur_rombank2)); |
| 113 | save_item(NAME(m_irq_adr_table)); |
| 114 | save_item(NAME(m_irq_enable)); |
| 115 | save_item(NAME(m_cur_rambank)); |
| 116 | save_item(NAME(m_cur_rombank)); |
| 117 | save_item(NAME(m_cur_rombank2)); |
| 120 | 118 | |
| 121 | | state->save_item(NAME(state->m_adpcm_pos)); |
| 122 | | state->save_item(NAME(state->m_adpcm_data)); |
| 123 | | state->save_item(NAME(state->m_trackx)); |
| 124 | | state->save_item(NAME(state->m_tracky)); |
| 125 | | state->save_item(NAME(state->m_mux_ctrl)); |
| 126 | | state->save_item(NAME(state->m_extport)); |
| 127 | | state->save_item(NAME(state->m_last_irq_level)); |
| 128 | | state->save_item(NAME(state->m_high)); |
| 129 | | state->save_item(NAME(state->m_high2)); |
| 119 | save_item(NAME(m_adpcm_pos)); |
| 120 | save_item(NAME(m_adpcm_data)); |
| 121 | save_item(NAME(m_trackx)); |
| 122 | save_item(NAME(m_tracky)); |
| 123 | save_item(NAME(m_mux_ctrl)); |
| 124 | save_item(NAME(m_extport)); |
| 125 | save_item(NAME(m_last_irq_level)); |
| 126 | save_item(NAME(m_high)); |
| 127 | save_item(NAME(m_high2)); |
| 130 | 128 | |
| 131 | | state->save_item(NAME(state->m_mcu_pos)); |
| 132 | | state->save_item(NAME(state->m_mcu_reply_len)); |
| 133 | | state->save_item(NAME(state->m_last_data_adr)); |
| 134 | | state->save_item(NAME(state->m_last_data)); |
| 135 | | state->save_item(NAME(state->m_cur_bank)); |
| 129 | save_item(NAME(m_mcu_pos)); |
| 130 | save_item(NAME(m_mcu_reply_len)); |
| 131 | save_item(NAME(m_last_data_adr)); |
| 132 | save_item(NAME(m_last_data)); |
| 133 | save_item(NAME(m_cur_bank)); |
| 136 | 134 | |
| 137 | | state->save_item(NAME(state->m_bankc)); |
| 138 | | state->save_item(NAME(state->m_horshoes_gfxbank)); |
| 139 | | state->save_item(NAME(state->m_cur_ctrl)); |
| 140 | | state->save_item(NAME(state->m_flipscreen)); |
| 135 | save_item(NAME(m_bankc)); |
| 136 | save_item(NAME(m_horshoes_gfxbank)); |
| 137 | save_item(NAME(m_cur_ctrl)); |
| 138 | save_item(NAME(m_flipscreen)); |
| 141 | 139 | } |
| 142 | 140 | |
| 143 | 141 | MACHINE_START_MEMBER(taitol_state,taito_l) |
| r21022 | r21023 | |
| 149 | 147 | save_item(NAME(m_palette_ram)); |
| 150 | 148 | save_item(NAME(m_empty_ram)); |
| 151 | 149 | |
| 152 | | state_register(machine()); |
| 150 | state_register(); |
| 153 | 151 | } |
| 154 | 152 | |
| 155 | | static void taito_machine_reset(running_machine &machine) |
| 153 | void taitol_state::taito_machine_reset() |
| 156 | 154 | { |
| 157 | | taitol_state *state = machine.driver_data<taitol_state>(); |
| 158 | 155 | int i; |
| 159 | 156 | |
| 160 | 157 | for (i = 0; i < 3; i++) |
| 161 | | state->m_irq_adr_table[i] = 0; |
| 158 | m_irq_adr_table[i] = 0; |
| 162 | 159 | |
| 163 | | state->m_irq_enable = 0; |
| 160 | m_irq_enable = 0; |
| 164 | 161 | |
| 165 | 162 | for (i = 0; i < 4; i++) |
| 166 | 163 | { |
| 167 | | state->m_cur_rambank[i] = 0x80; |
| 168 | | state->m_current_notifier[i] = palette_notifier; |
| 169 | | state->m_current_base[i] = state->m_palette_ram; |
| 170 | | state->membank(bankname[i])->set_base(state->m_current_base[i]); |
| 164 | m_cur_rambank[i] = 0x80; |
| 165 | m_current_notifier[i] = &taitol_state::palette_notifier; |
| 166 | m_current_base[i] = m_palette_ram; |
| 167 | membank(bankname[i])->set_base(m_current_base[i]); |
| 171 | 168 | } |
| 172 | 169 | |
| 173 | | state->m_cur_rombank = state->m_cur_rombank2 = 0; |
| 174 | | state->membank("bank1")->set_base(machine.root_device().memregion("maincpu")->base()); |
| 170 | m_cur_rombank = m_cur_rombank2 = 0; |
| 171 | membank("bank1")->set_base(machine().root_device().memregion("maincpu")->base()); |
| 175 | 172 | |
| 176 | | machine.gfx[2]->set_source(state->m_rambanks); |
| 173 | machine().gfx[2]->set_source(m_rambanks); |
| 177 | 174 | |
| 178 | | state->m_adpcm_pos = 0; |
| 179 | | state->m_adpcm_data = -1; |
| 180 | | state->m_trackx = state->m_tracky = 0; |
| 181 | | state->m_mux_ctrl = 0; |
| 182 | | state->m_extport = 0; |
| 183 | | state->m_last_irq_level = 0; |
| 184 | | state->m_high = 0; |
| 185 | | state->m_high2 = 0; |
| 175 | m_adpcm_pos = 0; |
| 176 | m_adpcm_data = -1; |
| 177 | m_trackx = m_tracky = 0; |
| 178 | m_mux_ctrl = 0; |
| 179 | m_extport = 0; |
| 180 | m_last_irq_level = 0; |
| 181 | m_high = 0; |
| 182 | m_high2 = 0; |
| 186 | 183 | |
| 187 | | state->m_mcu_reply = puzznic_mcu_reply; |
| 184 | m_mcu_reply = puzznic_mcu_reply; |
| 188 | 185 | |
| 189 | | state->m_mcu_pos = state->m_mcu_reply_len = 0; |
| 190 | | state->m_last_data_adr = state->m_last_data = 0; |
| 191 | | state->m_cur_bank = 1; |
| 186 | m_mcu_pos = m_mcu_reply_len = 0; |
| 187 | m_last_data_adr = m_last_data = 0; |
| 188 | m_cur_bank = 1; |
| 192 | 189 | |
| 193 | 190 | /* video related */ |
| 194 | | state->m_bankc[0] = state->m_bankc[1] = state->m_bankc[2] = state->m_bankc[3] = 0; |
| 195 | | state->m_horshoes_gfxbank = 0; |
| 196 | | state->m_cur_ctrl = 0; |
| 197 | | state->m_flipscreen = 0; |
| 191 | m_bankc[0] = m_bankc[1] = m_bankc[2] = m_bankc[3] = 0; |
| 192 | m_horshoes_gfxbank = 0; |
| 193 | m_cur_ctrl = 0; |
| 194 | m_flipscreen = 0; |
| 198 | 195 | } |
| 199 | 196 | |
| 200 | 197 | |
| 201 | 198 | MACHINE_RESET_MEMBER(taitol_state,fhawk) |
| 202 | 199 | { |
| 203 | | taito_machine_reset(machine()); |
| 200 | taito_machine_reset(); |
| 204 | 201 | m_porte0_tag = NULL; |
| 205 | 202 | m_porte1_tag = NULL; |
| 206 | 203 | m_portf0_tag = NULL; |
| r21022 | r21023 | |
| 209 | 206 | |
| 210 | 207 | MACHINE_RESET_MEMBER(taitol_state,raimais) |
| 211 | 208 | { |
| 212 | | taito_machine_reset(machine()); |
| 209 | taito_machine_reset(); |
| 213 | 210 | m_porte0_tag = NULL; |
| 214 | 211 | m_porte1_tag = NULL; |
| 215 | 212 | m_portf0_tag = NULL; |
| r21022 | r21023 | |
| 218 | 215 | |
| 219 | 216 | MACHINE_RESET_MEMBER(taitol_state,champwr) |
| 220 | 217 | { |
| 221 | | taito_machine_reset(machine()); |
| 218 | taito_machine_reset(); |
| 222 | 219 | m_porte0_tag = NULL; |
| 223 | 220 | m_porte1_tag = NULL; |
| 224 | 221 | m_portf0_tag = NULL; |
| r21022 | r21023 | |
| 228 | 225 | |
| 229 | 226 | MACHINE_RESET_MEMBER(taitol_state,kurikint) |
| 230 | 227 | { |
| 231 | | taito_machine_reset(machine()); |
| 228 | taito_machine_reset(); |
| 232 | 229 | m_porte0_tag = NULL; |
| 233 | 230 | m_porte1_tag = NULL; |
| 234 | 231 | m_portf0_tag = NULL; |
| r21022 | r21023 | |
| 237 | 234 | |
| 238 | 235 | MACHINE_RESET_MEMBER(taitol_state,evilston) |
| 239 | 236 | { |
| 240 | | taito_machine_reset(machine()); |
| 237 | taito_machine_reset(); |
| 241 | 238 | m_porte0_tag = NULL; |
| 242 | 239 | m_porte1_tag = NULL; |
| 243 | 240 | m_portf0_tag = NULL; |
| r21022 | r21023 | |
| 246 | 243 | |
| 247 | 244 | MACHINE_RESET_MEMBER(taitol_state,puzznic) |
| 248 | 245 | { |
| 249 | | taito_machine_reset(machine()); |
| 246 | taito_machine_reset(); |
| 250 | 247 | m_porte0_tag = "DSWA"; |
| 251 | 248 | m_porte1_tag = "DSWB"; |
| 252 | 249 | m_portf0_tag = "IN0"; |
| r21022 | r21023 | |
| 255 | 252 | |
| 256 | 253 | MACHINE_RESET_MEMBER(taitol_state,plotting) |
| 257 | 254 | { |
| 258 | | taito_machine_reset(machine()); |
| 255 | taito_machine_reset(); |
| 259 | 256 | m_porte0_tag = "DSWA"; |
| 260 | 257 | m_porte1_tag = "DSWB"; |
| 261 | 258 | m_portf0_tag = "IN0"; |
| r21022 | r21023 | |
| 264 | 261 | |
| 265 | 262 | MACHINE_RESET_MEMBER(taitol_state,palamed) |
| 266 | 263 | { |
| 267 | | taito_machine_reset(machine()); |
| 264 | taito_machine_reset(); |
| 268 | 265 | m_porte0_tag = "DSWA"; |
| 269 | 266 | m_porte1_tag = NULL; |
| 270 | 267 | m_portf0_tag = "DSWB"; |
| r21022 | r21023 | |
| 273 | 270 | |
| 274 | 271 | MACHINE_RESET_MEMBER(taitol_state,cachat) |
| 275 | 272 | { |
| 276 | | taito_machine_reset(machine()); |
| 273 | taito_machine_reset(); |
| 277 | 274 | m_porte0_tag = "DSWA"; |
| 278 | 275 | m_porte1_tag = NULL; |
| 279 | 276 | m_portf0_tag = "DSWB"; |
| r21022 | r21023 | |
| 282 | 279 | |
| 283 | 280 | MACHINE_RESET_MEMBER(taitol_state,horshoes) |
| 284 | 281 | { |
| 285 | | taito_machine_reset(machine()); |
| 282 | taito_machine_reset(); |
| 286 | 283 | m_porte0_tag = "DSWA"; |
| 287 | 284 | m_porte1_tag = "DSWB"; |
| 288 | 285 | m_portf0_tag = "IN0"; |
| r21022 | r21023 | |
| 409 | 406 | } |
| 410 | 407 | else if (data == 0x80) |
| 411 | 408 | { |
| 412 | | m_current_notifier[offset] = palette_notifier; |
| 409 | m_current_notifier[offset] = &taitol_state::palette_notifier; |
| 413 | 410 | m_current_base[offset] = m_palette_ram; |
| 414 | 411 | } |
| 415 | 412 | else |
| r21022 | r21023 | |
| 427 | 424 | return m_cur_rambank[offset]; |
| 428 | 425 | } |
| 429 | 426 | |
| 430 | | static void bank_w(address_space &space, offs_t offset, UINT8 data, int banknum ) |
| 427 | void taitol_state::bank_w(address_space &space, offs_t offset, UINT8 data, int banknum ) |
| 431 | 428 | { |
| 432 | | taitol_state *state = space.machine().driver_data<taitol_state>(); |
| 433 | | |
| 434 | | if (state->m_current_base[banknum][offset] != data) |
| 429 | if (m_current_base[banknum][offset] != data) |
| 435 | 430 | { |
| 436 | | state->m_current_base[banknum][offset] = data; |
| 437 | | if (state->m_current_notifier[banknum]) |
| 438 | | state->m_current_notifier[banknum](space.machine(), offset); |
| 431 | m_current_base[banknum][offset] = data; |
| 432 | if (m_current_notifier[banknum]) |
| 433 | (this->*m_current_notifier[banknum])(offset); |
| 439 | 434 | } |
| 440 | 435 | } |
| 441 | 436 | |
trunk/src/mame/drivers/tumbleb.c
| r21022 | r21023 | |
| 466 | 466 | }; |
| 467 | 467 | |
| 468 | 468 | /* we use channels 1,2,3 for sound effects, and channel 4 for music */ |
| 469 | | static void tumbleb2_set_music_bank( running_machine &machine, int bank ) |
| 469 | void tumbleb_state::tumbleb2_set_music_bank( int bank ) |
| 470 | 470 | { |
| 471 | | UINT8 *oki = machine.root_device().memregion("oki")->base(); |
| 471 | UINT8 *oki = machine().root_device().memregion("oki")->base(); |
| 472 | 472 | memcpy(&oki[0x38000], &oki[0x80000 + 0x38000 + 0x8000 * bank], 0x8000); |
| 473 | 473 | } |
| 474 | 474 | |
| 475 | | static void tumbleb2_play_sound( okim6295_device *oki, int data ) |
| 475 | void tumbleb_state::tumbleb2_play_sound( okim6295_device *oki, int data ) |
| 476 | 476 | { |
| 477 | 477 | int status = oki->read_status(); |
| 478 | 478 | |
| r21022 | r21023 | |
| 505 | 505 | // bank 7 = how to play? |
| 506 | 506 | // bank 8 = boss??? |
| 507 | 507 | |
| 508 | | static void process_tumbleb2_music_command( okim6295_device *oki, int data ) |
| 508 | void tumbleb_state::process_tumbleb2_music_command( okim6295_device *oki, int data ) |
| 509 | 509 | { |
| 510 | | tumbleb_state *state = oki->machine().driver_data<tumbleb_state>(); |
| 511 | 510 | int status = oki->read_status(); |
| 512 | 511 | |
| 513 | 512 | if (data == 1) // stop? |
| r21022 | r21023 | |
| 515 | 514 | if (BIT(status, 3)) |
| 516 | 515 | { |
| 517 | 516 | oki->write_command(0x40); /* Stop playing music */ |
| 518 | | state->m_music_is_playing = 0; |
| 517 | m_music_is_playing = 0; |
| 519 | 518 | } |
| 520 | 519 | } |
| 521 | 520 | else |
| 522 | 521 | { |
| 523 | | if (state->m_music_is_playing != data) |
| 522 | if (m_music_is_playing != data) |
| 524 | 523 | { |
| 525 | | state->m_music_is_playing = data; |
| 524 | m_music_is_playing = data; |
| 526 | 525 | oki->write_command(0x40); // stop the current music |
| 527 | 526 | switch (data) |
| 528 | 527 | { |
| 529 | 528 | case 0x04: // map screen |
| 530 | | state->m_music_bank = 1; |
| 531 | | state->m_music_command = 0x38; |
| 529 | m_music_bank = 1; |
| 530 | m_music_command = 0x38; |
| 532 | 531 | break; |
| 533 | 532 | |
| 534 | 533 | case 0x05: // america |
| 535 | | state->m_music_bank = 6; |
| 536 | | state->m_music_command = 0x38; |
| 534 | m_music_bank = 6; |
| 535 | m_music_command = 0x38; |
| 537 | 536 | break; |
| 538 | 537 | |
| 539 | 538 | case 0x06: // asia |
| 540 | | state->m_music_bank = 2; |
| 541 | | state->m_music_command = 0x38; |
| 539 | m_music_bank = 2; |
| 540 | m_music_command = 0x38; |
| 542 | 541 | break; |
| 543 | 542 | |
| 544 | 543 | case 0x07: // africa/egypt -- don't seem to have a tune for this one |
| 545 | | state->m_music_bank = 4; |
| 546 | | state->m_music_command = 0x38; |
| 544 | m_music_bank = 4; |
| 545 | m_music_command = 0x38; |
| 547 | 546 | break; |
| 548 | 547 | |
| 549 | 548 | case 0x08: // antartica |
| 550 | | state->m_music_bank = 3; |
| 551 | | state->m_music_command = 0x38; |
| 549 | m_music_bank = 3; |
| 550 | m_music_command = 0x38; |
| 552 | 551 | break; |
| 553 | 552 | |
| 554 | 553 | case 0x09: // brazil / south america |
| 555 | | state->m_music_bank = 4; |
| 556 | | state->m_music_command = 0x38; |
| 554 | m_music_bank = 4; |
| 555 | m_music_command = 0x38; |
| 557 | 556 | break; |
| 558 | 557 | |
| 559 | 558 | case 0x0a: // japan -- don't seem to have a tune |
| 560 | | state->m_music_bank = 2; |
| 561 | | state->m_music_command = 0x38; |
| 559 | m_music_bank = 2; |
| 560 | m_music_command = 0x38; |
| 562 | 561 | break; |
| 563 | 562 | |
| 564 | 563 | case 0x0b: // australia |
| 565 | | state->m_music_bank = 5; |
| 566 | | state->m_music_command = 0x38; |
| 564 | m_music_bank = 5; |
| 565 | m_music_command = 0x38; |
| 567 | 566 | break; |
| 568 | 567 | |
| 569 | 568 | case 0x0c: // france/europe |
| 570 | | state->m_music_bank = 6; |
| 571 | | state->m_music_command = 0x38; |
| 569 | m_music_bank = 6; |
| 570 | m_music_command = 0x38; |
| 572 | 571 | break; |
| 573 | 572 | |
| 574 | 573 | case 0x0d: // how to play |
| 575 | | state->m_music_bank = 7; |
| 576 | | state->m_music_command = 0x38; |
| 574 | m_music_bank = 7; |
| 575 | m_music_command = 0x38; |
| 577 | 576 | break; |
| 578 | 577 | |
| 579 | 578 | case 0x0f: // stage clear |
| 580 | | state->m_music_bank = 0; |
| 581 | | state->m_music_command = 0x33; |
| 579 | m_music_bank = 0; |
| 580 | m_music_command = 0x33; |
| 582 | 581 | break; |
| 583 | 582 | |
| 584 | 583 | case 0x10: // boss stage |
| 585 | | state->m_music_bank = 8; |
| 586 | | state->m_music_command = 0x38; |
| 584 | m_music_bank = 8; |
| 585 | m_music_command = 0x38; |
| 587 | 586 | break; |
| 588 | 587 | |
| 589 | 588 | case 0x12: // world clear |
| 590 | | state->m_music_bank = 0; |
| 591 | | state->m_music_command = 0x34; |
| 589 | m_music_bank = 0; |
| 590 | m_music_command = 0x34; |
| 592 | 591 | break; |
| 593 | 592 | |
| 594 | 593 | default: // anything else.. |
| 595 | | state->m_music_bank = 8; |
| 596 | | state->m_music_command = 0x38; |
| 594 | m_music_bank = 8; |
| 595 | m_music_command = 0x38; |
| 597 | 596 | break; |
| 598 | 597 | } |
| 599 | 598 | |
| 600 | | tumbleb2_set_music_bank(oki->machine(), state->m_music_bank); |
| 599 | tumbleb2_set_music_bank(m_music_bank); |
| 601 | 600 | tumbleb2_playmusic(oki); |
| 602 | 601 | } |
| 603 | 602 | } |
| r21022 | r21023 | |
| 3192 | 3191 | /******************************************************************************/ |
| 3193 | 3192 | |
| 3194 | 3193 | #if TUMBLEP_HACK |
| 3195 | | void tumblepb_patch_code(running_machine &machine, UINT16 offset) |
| 3194 | void tumbleb_state::tumblepb_patch_code(UINT16 offset) |
| 3196 | 3195 | { |
| 3197 | 3196 | /* A hack which enables all Dip Switches effects */ |
| 3198 | | UINT16 *RAM = (UINT16 *)machine.root_device().memregion("maincpu")->base(); |
| 3197 | UINT16 *RAM = (UINT16 *)machine().root_device().memregion("maincpu")->base(); |
| 3199 | 3198 | RAM[(offset + 0)/2] = 0x0240; |
| 3200 | 3199 | RAM[(offset + 2)/2] = 0xffff; // andi.w #$f3ff, D0 |
| 3201 | 3200 | } |
| 3202 | 3201 | #endif |
| 3203 | 3202 | |
| 3204 | 3203 | |
| 3205 | | static void tumblepb_gfx_rearrange(running_machine &machine, int rgn) |
| 3204 | void tumbleb_state::tumblepb_gfx_rearrange(int rgn) |
| 3206 | 3205 | { |
| 3207 | 3206 | UINT8* rom; |
| 3208 | 3207 | int len; |
| 3209 | 3208 | |
| 3210 | 3209 | if (rgn == 1) |
| 3211 | 3210 | { |
| 3212 | | rom = machine.root_device().memregion("tilegfx")->base(); |
| 3213 | | len = machine.root_device().memregion("tilegfx")->bytes(); |
| 3211 | rom = machine().root_device().memregion("tilegfx")->base(); |
| 3212 | len = machine().root_device().memregion("tilegfx")->bytes(); |
| 3214 | 3213 | } |
| 3215 | 3214 | else |
| 3216 | 3215 | { |
| 3217 | | rom = machine.root_device().memregion("sprgfx")->base(); |
| 3218 | | len = machine.root_device().memregion("sprgfx")->bytes(); |
| 3216 | rom = machine().root_device().memregion("sprgfx")->base(); |
| 3217 | len = machine().root_device().memregion("sprgfx")->bytes(); |
| 3219 | 3218 | } |
| 3220 | 3219 | |
| 3221 | 3220 | int i; |
| r21022 | r21023 | |
| 3237 | 3236 | |
| 3238 | 3237 | DRIVER_INIT_MEMBER(tumbleb_state,tumblepb) |
| 3239 | 3238 | { |
| 3240 | | tumblepb_gfx_rearrange(machine(), 1); |
| 3239 | tumblepb_gfx_rearrange(1); |
| 3241 | 3240 | |
| 3242 | 3241 | #if TUMBLEP_HACK |
| 3243 | | tumblepb_patch_code(machine(), 0x000132); |
| 3242 | tumblepb_patch_code(0x000132); |
| 3244 | 3243 | #endif |
| 3245 | 3244 | } |
| 3246 | 3245 | |
| 3247 | 3246 | DRIVER_INIT_MEMBER(tumbleb_state,tumblepba) |
| 3248 | 3247 | { |
| 3249 | 3248 | // rearrange the bg data instead of the sprite data on this one! |
| 3250 | | tumblepb_gfx_rearrange(machine(), 2); |
| 3249 | tumblepb_gfx_rearrange(2); |
| 3251 | 3250 | } |
| 3252 | 3251 | |
| 3253 | 3252 | DRIVER_INIT_MEMBER(tumbleb_state,tumbleb2) |
| 3254 | 3253 | { |
| 3255 | | tumblepb_gfx_rearrange(machine(), 1); |
| 3254 | tumblepb_gfx_rearrange(1); |
| 3256 | 3255 | |
| 3257 | 3256 | #if TUMBLEP_HACK |
| 3258 | | tumblepb_patch_code(machine(), 0x000132); |
| 3257 | tumblepb_patch_code(0x000132); |
| 3259 | 3258 | #endif |
| 3260 | 3259 | machine().device("maincpu")->memory().space(AS_PROGRAM).install_write_handler(0x100000, 0x100001, write16_delegate(FUNC(tumbleb_state::tumbleb2_soundmcu_w),this)); |
| 3261 | 3260 | |
| r21022 | r21023 | |
| 3263 | 3262 | |
| 3264 | 3263 | DRIVER_INIT_MEMBER(tumbleb_state,jumpkids) |
| 3265 | 3264 | { |
| 3266 | | tumblepb_gfx_rearrange(machine(), 1); |
| 3265 | tumblepb_gfx_rearrange(1); |
| 3267 | 3266 | |
| 3268 | 3267 | #if TUMBLEP_HACK |
| 3269 | | tumblepb_patch_code(machine(), 0x00013a); |
| 3268 | tumblepb_patch_code(0x00013a); |
| 3270 | 3269 | #endif |
| 3271 | 3270 | } |
| 3272 | 3271 | |
| 3273 | 3272 | DRIVER_INIT_MEMBER(tumbleb_state,fncywld) |
| 3274 | 3273 | { |
| 3275 | | tumblepb_gfx_rearrange(machine(), 1); |
| 3274 | tumblepb_gfx_rearrange(1); |
| 3276 | 3275 | |
| 3277 | 3276 | #if FNCYWLD_HACK |
| 3278 | 3277 | /* This is a hack to allow you to use the extra features |
| r21022 | r21023 | |
| 3294 | 3293 | |
| 3295 | 3294 | DRIVER_INIT_MEMBER(tumbleb_state,bcstory) |
| 3296 | 3295 | { |
| 3297 | | tumblepb_gfx_rearrange(machine(), 1); |
| 3296 | tumblepb_gfx_rearrange(1); |
| 3298 | 3297 | machine().device("maincpu")->memory().space(AS_PROGRAM).install_read_handler(0x180008, 0x180009, read16_delegate(FUNC(tumbleb_state::bcstory_1a0_read),this)); // io should be here?? |
| 3299 | 3298 | } |
| 3300 | 3299 | |
| r21022 | r21023 | |
| 3308 | 3307 | for (i = 0; i < len / 2; i++) |
| 3309 | 3308 | m_mainram[0x000/2 + i] = PROTDATA[i]; |
| 3310 | 3309 | |
| 3311 | | tumblepb_gfx_rearrange(machine(), 1); |
| 3310 | tumblepb_gfx_rearrange(1); |
| 3312 | 3311 | |
| 3313 | 3312 | } |
| 3314 | 3313 | |
| 3315 | 3314 | |
| 3316 | | static void suprtrio_decrypt_code(running_machine &machine) |
| 3315 | void tumbleb_state::suprtrio_decrypt_code() |
| 3317 | 3316 | { |
| 3318 | | UINT16 *rom = (UINT16 *)machine.root_device().memregion("maincpu")->base(); |
| 3319 | | UINT16 *buf = auto_alloc_array(machine, UINT16, 0x80000/2); |
| 3317 | UINT16 *rom = (UINT16 *)machine().root_device().memregion("maincpu")->base(); |
| 3318 | UINT16 *buf = auto_alloc_array(machine(), UINT16, 0x80000/2); |
| 3320 | 3319 | int i; |
| 3321 | 3320 | |
| 3322 | 3321 | /* decrypt main ROMs */ |
| r21022 | r21023 | |
| 3328 | 3327 | if ((i & 3) == 0) j ^= 0x08; |
| 3329 | 3328 | rom[i] = buf[j]; |
| 3330 | 3329 | } |
| 3331 | | auto_free(machine, buf); |
| 3330 | auto_free(machine(), buf); |
| 3332 | 3331 | } |
| 3333 | 3332 | |
| 3334 | | static void suprtrio_decrypt_gfx(running_machine &machine) |
| 3333 | void tumbleb_state::suprtrio_decrypt_gfx() |
| 3335 | 3334 | { |
| 3336 | | UINT16 *rom = (UINT16 *)machine.root_device().memregion("tilegfx")->base(); |
| 3337 | | UINT16 *buf = auto_alloc_array(machine, UINT16, 0x100000/2); |
| 3335 | UINT16 *rom = (UINT16 *)machine().root_device().memregion("tilegfx")->base(); |
| 3336 | UINT16 *buf = auto_alloc_array(machine(), UINT16, 0x100000/2); |
| 3338 | 3337 | int i; |
| 3339 | 3338 | |
| 3340 | 3339 | /* decrypt tiles */ |
| r21022 | r21023 | |
| 3345 | 3344 | if (i & 1) j ^= 0x04; |
| 3346 | 3345 | rom[i] = buf[j]; |
| 3347 | 3346 | } |
| 3348 | | auto_free(machine, buf); |
| 3347 | auto_free(machine(), buf); |
| 3349 | 3348 | } |
| 3350 | 3349 | |
| 3351 | 3350 | DRIVER_INIT_MEMBER(tumbleb_state,suprtrio) |
| 3352 | 3351 | { |
| 3353 | | suprtrio_decrypt_code(machine()); |
| 3354 | | suprtrio_decrypt_gfx(machine()); |
| 3352 | suprtrio_decrypt_code(); |
| 3353 | suprtrio_decrypt_gfx(); |
| 3355 | 3354 | } |
| 3356 | 3355 | |
| 3357 | 3356 | DRIVER_INIT_MEMBER(tumbleb_state,chokchok) |
| r21022 | r21023 | |
| 3367 | 3366 | |
| 3368 | 3367 | DRIVER_INIT_MEMBER(tumbleb_state,wlstar) |
| 3369 | 3368 | { |
| 3370 | | tumblepb_gfx_rearrange(machine(), 1); |
| 3369 | tumblepb_gfx_rearrange(1); |
| 3371 | 3370 | |
| 3372 | 3371 | /* slightly different banking */ |
| 3373 | 3372 | machine().device("maincpu")->memory().space(AS_PROGRAM).install_write_handler(0x100002, 0x100003, write16_delegate(FUNC(tumbleb_state::wlstar_tilebank_w),this)); |
| r21022 | r21023 | |
| 3383 | 3382 | |
| 3384 | 3383 | DRIVER_INIT_MEMBER(tumbleb_state,dquizgo) |
| 3385 | 3384 | { |
| 3386 | | tumblepb_gfx_rearrange(machine(), 1); |
| 3385 | tumblepb_gfx_rearrange(1); |
| 3387 | 3386 | } |
| 3388 | 3387 | |
| 3389 | 3388 | |
trunk/src/mame/machine/twincobr.c
| r21022 | r21023 | |
| 174 | 174 | } |
| 175 | 175 | |
| 176 | 176 | |
| 177 | | static void twincobr_dsp(running_machine &machine, int enable) |
| 177 | void twincobr_state::twincobr_dsp(int enable) |
| 178 | 178 | { |
| 179 | | twincobr_state *state = machine.driver_data<twincobr_state>(); |
| 180 | | state->m_dsp_on = enable; |
| 179 | m_dsp_on = enable; |
| 181 | 180 | if (enable) { |
| 182 | 181 | LOG(("Turning DSP on and main CPU off\n")); |
| 183 | | machine.device("dsp")->execute().set_input_line(INPUT_LINE_HALT, CLEAR_LINE); |
| 184 | | machine.device("dsp")->execute().set_input_line(0, ASSERT_LINE); /* TMS32010 INT */ |
| 185 | | machine.device("maincpu")->execute().set_input_line(INPUT_LINE_HALT, ASSERT_LINE); |
| 182 | machine().device("dsp")->execute().set_input_line(INPUT_LINE_HALT, CLEAR_LINE); |
| 183 | machine().device("dsp")->execute().set_input_line(0, ASSERT_LINE); /* TMS32010 INT */ |
| 184 | machine().device("maincpu")->execute().set_input_line(INPUT_LINE_HALT, ASSERT_LINE); |
| 186 | 185 | } |
| 187 | 186 | else { |
| 188 | 187 | LOG(("Turning DSP off\n")); |
| 189 | | machine.device("dsp")->execute().set_input_line(0, CLEAR_LINE); /* TMS32010 INT */ |
| 190 | | machine.device("dsp")->execute().set_input_line(INPUT_LINE_HALT, ASSERT_LINE); |
| 188 | machine().device("dsp")->execute().set_input_line(0, CLEAR_LINE); /* TMS32010 INT */ |
| 189 | machine().device("dsp")->execute().set_input_line(INPUT_LINE_HALT, ASSERT_LINE); |
| 191 | 190 | } |
| 192 | 191 | } |
| 193 | 192 | |
| 194 | 193 | void twincobr_state::twincobr_restore_dsp() |
| 195 | 194 | { |
| 196 | | twincobr_dsp(machine(), m_dsp_on); |
| 195 | twincobr_dsp(m_dsp_on); |
| 197 | 196 | } |
| 198 | 197 | |
| 199 | 198 | |
| 200 | | static void toaplan0_control_w(running_machine &machine, int offset, int data) |
| 199 | void twincobr_state::toaplan0_control_w(int offset, int data) |
| 201 | 200 | { |
| 202 | | twincobr_state *state = machine.driver_data<twincobr_state>(); |
| 203 | | LOG(("%s:Writing %08x to %08x.\n",machine.describe_context(),data,toaplan_port_type[state->m_toaplan_main_cpu] - offset)); |
| 201 | LOG(("%s:Writing %08x to %08x.\n",machine().describe_context(),data,toaplan_port_type[m_toaplan_main_cpu] - offset)); |
| 204 | 202 | |
| 205 | | if (state->m_toaplan_main_cpu == 1) { |
| 206 | | if (data == 0x0c) { data = 0x1c; state->m_wardner_sprite_hack=0; } /* Z80 ? */ |
| 207 | | if (data == 0x0d) { data = 0x1d; state->m_wardner_sprite_hack=1; } /* Z80 ? */ |
| 203 | if (m_toaplan_main_cpu == 1) { |
| 204 | if (data == 0x0c) { data = 0x1c; m_wardner_sprite_hack=0; } /* Z80 ? */ |
| 205 | if (data == 0x0d) { data = 0x1d; m_wardner_sprite_hack=1; } /* Z80 ? */ |
| 208 | 206 | } |
| 209 | 207 | |
| 210 | 208 | switch (data) { |
| 211 | | case 0x0004: state->m_intenable = 0; break; |
| 212 | | case 0x0005: state->m_intenable = 1; break; |
| 213 | | case 0x0006: twincobr_flipscreen(machine, 0); break; |
| 214 | | case 0x0007: twincobr_flipscreen(machine, 1); break; |
| 215 | | case 0x0008: state->m_bg_ram_bank = 0x0000; break; |
| 216 | | case 0x0009: state->m_bg_ram_bank = 0x1000; break; |
| 217 | | case 0x000a: state->m_fg_rom_bank = 0x0000; break; |
| 218 | | case 0x000b: state->m_fg_rom_bank = 0x1000; break; |
| 219 | | case 0x000c: twincobr_dsp(machine, 1); break; /* Enable the INT line to the DSP */ |
| 220 | | case 0x000d: twincobr_dsp(machine, 0); break; /* Inhibit the INT line to the DSP */ |
| 221 | | case 0x000e: twincobr_display(machine, 0); break; /* Turn display off */ |
| 222 | | case 0x000f: twincobr_display(machine, 1); break; /* Turn display on */ |
| 209 | case 0x0004: m_intenable = 0; break; |
| 210 | case 0x0005: m_intenable = 1; break; |
| 211 | case 0x0006: twincobr_flipscreen(0); break; |
| 212 | case 0x0007: twincobr_flipscreen(1); break; |
| 213 | case 0x0008: m_bg_ram_bank = 0x0000; break; |
| 214 | case 0x0009: m_bg_ram_bank = 0x1000; break; |
| 215 | case 0x000a: m_fg_rom_bank = 0x0000; break; |
| 216 | case 0x000b: m_fg_rom_bank = 0x1000; break; |
| 217 | case 0x000c: twincobr_dsp(1); break; /* Enable the INT line to the DSP */ |
| 218 | case 0x000d: twincobr_dsp(0); break; /* Inhibit the INT line to the DSP */ |
| 219 | case 0x000e: twincobr_display(0); break; /* Turn display off */ |
| 220 | case 0x000f: twincobr_display(1); break; /* Turn display on */ |
| 223 | 221 | } |
| 224 | 222 | } |
| 225 | 223 | |
| r21022 | r21023 | |
| 227 | 225 | { |
| 228 | 226 | if (ACCESSING_BITS_0_7) |
| 229 | 227 | { |
| 230 | | toaplan0_control_w(machine(), offset, data & 0xff); |
| 228 | toaplan0_control_w(offset, data & 0xff); |
| 231 | 229 | } |
| 232 | 230 | } |
| 233 | 231 | |
| 234 | 232 | WRITE8_MEMBER(twincobr_state::wardner_control_w) |
| 235 | 233 | { |
| 236 | | toaplan0_control_w(machine(), offset, data); |
| 234 | toaplan0_control_w(offset, data); |
| 237 | 235 | } |
| 238 | 236 | |
| 239 | 237 | |
| r21022 | r21023 | |
| 251 | 249 | } |
| 252 | 250 | |
| 253 | 251 | |
| 254 | | static void toaplan0_coin_dsp_w(address_space &space, int offset, int data) |
| 252 | void twincobr_state::toaplan0_coin_dsp_w(address_space &space, int offset, int data) |
| 255 | 253 | { |
| 256 | | twincobr_state *state = space.machine().driver_data<twincobr_state>(); |
| 257 | 254 | if (data > 1) |
| 258 | | LOG(("%s:Writing %08x to %08x.\n",space.machine().describe_context(),data,toaplan_port_type[state->m_toaplan_main_cpu] - offset)); |
| 255 | LOG(("%s:Writing %08x to %08x.\n",machine().describe_context(),data,toaplan_port_type[m_toaplan_main_cpu] - offset)); |
| 259 | 256 | switch (data) { |
| 260 | | case 0x08: coin_counter_w(space.machine(), 0,0); break; |
| 261 | | case 0x09: coin_counter_w(space.machine(), 0,1); break; |
| 262 | | case 0x0a: coin_counter_w(space.machine(), 1,0); break; |
| 263 | | case 0x0b: coin_counter_w(space.machine(), 1,1); break; |
| 264 | | case 0x0c: coin_lockout_w(space.machine(), 0,1); break; |
| 265 | | case 0x0d: coin_lockout_w(space.machine(), 0,0); break; |
| 266 | | case 0x0e: coin_lockout_w(space.machine(), 1,1); break; |
| 267 | | case 0x0f: coin_lockout_w(space.machine(), 1,0); break; |
| 257 | case 0x08: coin_counter_w(machine(), 0,0); break; |
| 258 | case 0x09: coin_counter_w(machine(), 0,1); break; |
| 259 | case 0x0a: coin_counter_w(machine(), 1,0); break; |
| 260 | case 0x0b: coin_counter_w(machine(), 1,1); break; |
| 261 | case 0x0c: coin_lockout_w(machine(), 0,1); break; |
| 262 | case 0x0d: coin_lockout_w(machine(), 0,0); break; |
| 263 | case 0x0e: coin_lockout_w(machine(), 1,1); break; |
| 264 | case 0x0f: coin_lockout_w(machine(), 1,0); break; |
| 268 | 265 | /****** The following apply to Flying Shark/Wardner only ******/ |
| 269 | 266 | case 0x00: /* This means assert the INT line to the DSP */ |
| 270 | 267 | LOG(("Turning DSP on and main CPU off\n")); |
| 271 | | space.machine().device("dsp")->execute().set_input_line(INPUT_LINE_HALT, CLEAR_LINE); |
| 272 | | space.machine().device("dsp")->execute().set_input_line(0, ASSERT_LINE); /* TMS32010 INT */ |
| 273 | | space.machine().device("maincpu")->execute().set_input_line(INPUT_LINE_HALT, ASSERT_LINE); |
| 268 | machine().device("dsp")->execute().set_input_line(INPUT_LINE_HALT, CLEAR_LINE); |
| 269 | machine().device("dsp")->execute().set_input_line(0, ASSERT_LINE); /* TMS32010 INT */ |
| 270 | machine().device("maincpu")->execute().set_input_line(INPUT_LINE_HALT, ASSERT_LINE); |
| 274 | 271 | break; |
| 275 | 272 | case 0x01: /* This means inhibit the INT line to the DSP */ |
| 276 | 273 | LOG(("Turning DSP off\n")); |
| 277 | | space.machine().device("dsp")->execute().set_input_line(0, CLEAR_LINE); /* TMS32010 INT */ |
| 278 | | space.machine().device("dsp")->execute().set_input_line(INPUT_LINE_HALT, ASSERT_LINE); |
| 274 | machine().device("dsp")->execute().set_input_line(0, CLEAR_LINE); /* TMS32010 INT */ |
| 275 | machine().device("dsp")->execute().set_input_line(INPUT_LINE_HALT, ASSERT_LINE); |
| 279 | 276 | break; |
| 280 | 277 | } |
| 281 | 278 | } |
| r21022 | r21023 | |
| 303 | 300 | MACHINE_RESET_MEMBER(twincobr_state,twincobr) |
| 304 | 301 | { |
| 305 | 302 | m_toaplan_main_cpu = 0; /* 68000 */ |
| 306 | | twincobr_display(machine(), 0); |
| 303 | twincobr_display(0); |
| 307 | 304 | m_intenable = 0; |
| 308 | 305 | m_dsp_addr_w = 0; |
| 309 | 306 | m_main_ram_seg = 0; |
| r21022 | r21023 | |
| 318 | 315 | MACHINE_RESET_CALL_MEMBER(twincobr); |
| 319 | 316 | |
| 320 | 317 | m_toaplan_main_cpu = 1; /* Z80 */ |
| 321 | | twincobr_display(machine(), 1); |
| 318 | twincobr_display(1); |
| 322 | 319 | } |
| 323 | 320 | |
| 324 | | void twincobr_driver_savestate(running_machine &machine) |
| 321 | void twincobr_state::twincobr_driver_savestate() |
| 325 | 322 | { |
| 326 | | twincobr_state *state = machine.driver_data<twincobr_state>(); |
| 327 | 323 | |
| 328 | | state_save_register_global(machine, state->m_toaplan_main_cpu); |
| 329 | | state_save_register_global(machine, state->m_intenable); |
| 330 | | state_save_register_global(machine, state->m_dsp_on); |
| 331 | | state_save_register_global(machine, state->m_dsp_addr_w); |
| 332 | | state_save_register_global(machine, state->m_main_ram_seg); |
| 333 | | state_save_register_global(machine, state->m_dsp_BIO); |
| 334 | | state_save_register_global(machine, state->m_dsp_execute); |
| 335 | | state_save_register_global(machine, state->m_fsharkbt_8741); |
| 336 | | state_save_register_global(machine, state->m_wardner_membank); |
| 324 | state_save_register_global(machine(), m_toaplan_main_cpu); |
| 325 | state_save_register_global(machine(), m_intenable); |
| 326 | state_save_register_global(machine(), m_dsp_on); |
| 327 | state_save_register_global(machine(), m_dsp_addr_w); |
| 328 | state_save_register_global(machine(), m_main_ram_seg); |
| 329 | state_save_register_global(machine(), m_dsp_BIO); |
| 330 | state_save_register_global(machine(), m_dsp_execute); |
| 331 | state_save_register_global(machine(), m_fsharkbt_8741); |
| 332 | state_save_register_global(machine(), m_wardner_membank); |
| 337 | 333 | |
| 338 | | machine.save().register_postload(save_prepost_delegate(FUNC(twincobr_state::twincobr_restore_dsp), state)); |
| 334 | machine().save().register_postload(save_prepost_delegate(FUNC(twincobr_state::twincobr_restore_dsp), this)); |
| 339 | 335 | } |