trunk/src/mame/drivers/coolridr.c
| r21279 | r21280 | |
| 400 | 400 | UINT16 m_textOffset; |
| 401 | 401 | UINT16 m_vCellCount; |
| 402 | 402 | UINT16 m_hCellCount; |
| 403 | UINT32 m_blitterClearMode; |
| 404 | INT16 m_blitterClearCount; |
| 403 | 405 | int m_vPosition; |
| 404 | 406 | int m_hPosition; |
| 405 | 407 | |
| r21279 | r21280 | |
| 446 | 448 | required_shared_ptr<UINT16> m_soundram2; |
| 447 | 449 | bitmap_rgb32 m_temp_bitmap_sprites; |
| 448 | 450 | bitmap_rgb32 m_temp_bitmap_sprites2; |
| 451 | bitmap_rgb32 m_screen1_bitmap; |
| 452 | bitmap_rgb32 m_screen2_bitmap; |
| 449 | 453 | int m_color; |
| 450 | 454 | UINT8 m_vblank; |
| 451 | 455 | int m_scsp_last_line; |
| r21279 | r21280 | |
| 488 | 492 | INTERRUPT_GEN_MEMBER(system_h1); |
| 489 | 493 | TIMER_DEVICE_CALLBACK_MEMBER(system_h1_main); |
| 490 | 494 | TIMER_DEVICE_CALLBACK_MEMBER(system_h1_sub); |
| 495 | |
| 496 | void sysh1_dma_transfer( address_space &space, UINT16 dma_index ); |
| 497 | |
| 491 | 498 | }; |
| 492 | 499 | |
| 493 | 500 | #define PRINT_BLIT_STUFF \ |
| r21279 | r21280 | |
| 500 | 507 | { |
| 501 | 508 | machine().primary_screen->register_screen_bitmap(m_temp_bitmap_sprites); |
| 502 | 509 | machine().primary_screen->register_screen_bitmap(m_temp_bitmap_sprites2); |
| 510 | machine().primary_screen->register_screen_bitmap(m_screen1_bitmap); |
| 511 | machine().primary_screen->register_screen_bitmap(m_screen2_bitmap); |
| 503 | 512 | } |
| 504 | 513 | |
| 505 | 514 | // might be a page 'map / base' setup somewhere, but it's just used for ingame backgrounds |
| r21279 | r21280 | |
| 571 | 580 | |
| 572 | 581 | if (which==0) |
| 573 | 582 | { |
| 574 | | copybitmap_trans(bitmap, m_temp_bitmap_sprites, 0, 0, 0, 0, cliprect, 0); |
| 575 | | m_temp_bitmap_sprites.fill(0, cliprect); |
| 583 | copybitmap_trans(bitmap, m_screen1_bitmap, 0, 0, 0, 0, cliprect, 0); |
| 576 | 584 | } |
| 577 | 585 | else |
| 578 | 586 | { |
| 579 | | copybitmap_trans(bitmap, m_temp_bitmap_sprites2, 0, 0, 0, 0, cliprect, 0); |
| 580 | | m_temp_bitmap_sprites2.fill(0, cliprect); |
| 587 | copybitmap_trans(bitmap, m_screen2_bitmap, 0, 0, 0, 0, cliprect, 0); |
| 581 | 588 | } |
| 582 | 589 | |
| 583 | 590 | return 0; |
| r21279 | r21280 | |
| 624 | 631 | |
| 625 | 632 | |
| 626 | 633 | |
| 634 | /* |
| 635 | if(type == 4) |
| 627 | 636 | |
| 628 | 637 | |
| 638 | */ |
| 639 | |
| 629 | 640 | /* This is a RLE-based sprite blitter (US Patent #6,141,122), very unusual from Sega... */ |
| 630 | 641 | WRITE32_MEMBER(coolridr_state::sysh1_txt_blit_w) |
| 631 | 642 | { |
| r21279 | r21280 | |
| 634 | 645 | |
| 635 | 646 | switch(offset) |
| 636 | 647 | { |
| 648 | /* |
| 649 | This does the fb display/clear phases of blitter data processed in the previous frame. |
| 650 | And yes, game effectively runs at 30 Hz (because data processing happens on even frames, actual display transfer happens on odd frames). |
| 651 | screen 1 |
| 652 | 8c200000 06 |
| 653 | 00000001 07 |
| 654 | 0000017f 07 Y range (upper start, lower end) |
| 655 | 000701f7 07 X range (upper start, lower end) |
| 656 | 00000007 07 enable? |
| 657 | screen 2 |
| 658 | 8c800000 06 |
| 659 | 00000001 07 |
| 660 | 0000017f 07 |
| 661 | 020703f7 07 |
| 662 | 00000207 07 enable plus clear? |
| 663 | */ |
| 664 | case 0x06: |
| 665 | m_blitterClearMode = m_sysh1_txt_blit[offset]; |
| 666 | |
| 667 | if(m_blitterClearMode != 0x8c200000 && m_blitterClearMode != 0x8c800000) |
| 668 | printf("Blitter Clear used with param %08x\n",m_blitterClearMode); |
| 669 | |
| 670 | m_blitterClearCount = 0; |
| 671 | break; |
| 672 | |
| 673 | case 0x07: |
| 674 | if(m_blitterClearCount == 0) |
| 675 | { |
| 676 | if(m_sysh1_txt_blit[offset] != 1) |
| 677 | printf("Blitter Clear Count == 0 used with param %08x\n",m_sysh1_txt_blit[offset]); |
| 678 | } |
| 679 | else if(m_blitterClearCount == 1) |
| 680 | { |
| 681 | if(m_sysh1_txt_blit[offset] != 0x17f) |
| 682 | printf("Blitter Clear Count == 1 used with param %08x\n",m_sysh1_txt_blit[offset]); |
| 683 | } |
| 684 | else if(m_blitterClearCount == 2) |
| 685 | { |
| 686 | if(m_sysh1_txt_blit[offset] != 0x000701f7 && m_sysh1_txt_blit[offset] != 0x020703f7) |
| 687 | printf("Blitter Clear Count == 2 used with param %08x\n",m_sysh1_txt_blit[offset]); |
| 688 | } |
| 689 | else if(m_blitterClearCount == 3) |
| 690 | { |
| 691 | if(m_sysh1_txt_blit[offset] != 0x00000007 && m_sysh1_txt_blit[offset] != 0x00000207) |
| 692 | printf("Blitter Clear Count == 3 used with param %08x\n",m_sysh1_txt_blit[offset]); |
| 693 | |
| 694 | { |
| 695 | const rectangle& visarea = machine().primary_screen->visible_area(); |
| 696 | |
| 697 | if(m_blitterClearMode == 0x8c200000) |
| 698 | { |
| 699 | copybitmap(m_screen1_bitmap, m_temp_bitmap_sprites, 0, 0, 0, 0, visarea); |
| 700 | m_temp_bitmap_sprites.fill(0, visarea); |
| 701 | } |
| 702 | |
| 703 | if(m_blitterClearMode == 0x8c800000) |
| 704 | { |
| 705 | copybitmap(m_screen2_bitmap, m_temp_bitmap_sprites2, 0, 0, 0, 0, visarea); |
| 706 | m_temp_bitmap_sprites2.fill(0, visarea); |
| 707 | } |
| 708 | } |
| 709 | } |
| 710 | else |
| 711 | { |
| 712 | printf("Blitter Clear Count == %02x used with param %08x\n",m_blitterClearCount,m_sysh1_txt_blit[offset]); |
| 713 | } |
| 714 | |
| 715 | |
| 716 | m_blitterClearCount++; |
| 717 | break; |
| 718 | |
| 637 | 719 | // The mode register |
| 638 | 720 | case 0x04: |
| 639 | 721 | { |
| r21279 | r21280 | |
| 1255 | 1337 | } |
| 1256 | 1338 | } |
| 1257 | 1339 | |
| 1258 | | |
| 1340 | |
| 1259 | 1341 | // these should be 'cell numbers' (tile numbers) which look up RLE data? |
| 1260 | 1342 | UINT32 spriteNumber = (m_expanded_10bit_gfx[ (m_b3romoffset << 3) + (lookupnum<<1) +0 ] << 10) | (m_expanded_10bit_gfx[ (m_b3romoffset << 3) + (lookupnum<<1) + 1 ]); |
| 1261 | 1343 | |
| r21279 | r21280 | |
| 1327 | 1409 | // DEBUG: Draw 16x16 block |
| 1328 | 1410 | UINT32* line; |
| 1329 | 1411 | if (m_b4flipy) |
| 1330 | | { |
| 1412 | { |
| 1331 | 1413 | for (int y = 0; y < 16; y++) |
| 1332 | 1414 | { |
| 1333 | 1415 | const int drawy = pixelOffsetY+y; |
| r21279 | r21280 | |
| 1473 | 1555 | |
| 1474 | 1556 | |
| 1475 | 1557 | /* FIXME: this seems to do a hell lot of stuff, it's not ST-V SCU but still somewhat complex :/ */ |
| 1476 | | static void sysh1_dma_transfer( address_space &space, UINT16 dma_index ) |
| 1558 | void coolridr_state::sysh1_dma_transfer( address_space &space, UINT16 dma_index ) |
| 1477 | 1559 | { |
| 1478 | | coolridr_state *state = space.machine().driver_data<coolridr_state>(); |
| 1479 | 1560 | UINT32 src,dst,size,type,s_i; |
| 1480 | 1561 | UINT8 end_dma_mark; |
| 1481 | 1562 | |
| 1482 | 1563 | end_dma_mark = 0; |
| 1483 | 1564 | |
| 1484 | 1565 | do{ |
| 1485 | | src = (state->m_framebuffer_vram[(0+dma_index)/4] & 0x0fffffff); |
| 1486 | | dst = (state->m_framebuffer_vram[(4+dma_index)/4]); |
| 1487 | | size = state->m_framebuffer_vram[(8+dma_index)/4]; |
| 1488 | | type = (state->m_framebuffer_vram[(0+dma_index)/4] & 0xf0000000) >> 28; |
| 1566 | src = (m_framebuffer_vram[(0+dma_index)/4] & 0x0fffffff); |
| 1567 | dst = (m_framebuffer_vram[(4+dma_index)/4]); |
| 1568 | size = m_framebuffer_vram[(8+dma_index)/4]; |
| 1569 | type = (m_framebuffer_vram[(0+dma_index)/4] & 0xf0000000) >> 28; |
| 1489 | 1570 | |
| 1490 | 1571 | #if 0 |
| 1491 | 1572 | if(type == 0xc || type == 0xd || type == 0xe) |