trunk/src/mame/drivers/coolridr.c
| r21404 | r21405 | |
| 468 | 468 | |
| 469 | 469 | void sysh1_dma_transfer( address_space &space, UINT16 dma_index ); |
| 470 | 470 | |
| 471 | | UINT8 *m_h1_vram; |
| 472 | | UINT8 *m_h1_pcg; |
| 473 | | UINT8 *m_h1_pal; |
| 471 | UINT16 *m_h1_vram; |
| 472 | UINT16 *m_h1_pcg; |
| 473 | UINT16 *m_h1_pal; |
| 474 | 474 | }; |
| 475 | 475 | |
| 476 | 476 | #define PRINT_BLIT_STUFF \ |
| r21404 | r21405 | |
| 498 | 498 | machine().primary_screen->register_screen_bitmap(m_screen1_bitmap); |
| 499 | 499 | machine().primary_screen->register_screen_bitmap(m_screen2_bitmap); |
| 500 | 500 | |
| 501 | | m_h1_vram = auto_alloc_array_clear(machine(), UINT8, VRAM_SIZE); |
| 502 | | m_h1_pcg = auto_alloc_array_clear(machine(), UINT8, VRAM_SIZE); |
| 503 | | m_h1_pal = auto_alloc_array_clear(machine(), UINT8, VRAM_SIZE); |
| 501 | m_h1_vram = auto_alloc_array_clear(machine(), UINT16, VRAM_SIZE); |
| 502 | m_h1_pcg = auto_alloc_array_clear(machine(), UINT16, VRAM_SIZE); |
| 503 | m_h1_pal = auto_alloc_array_clear(machine(), UINT16, VRAM_SIZE); |
| 504 | 504 | |
| 505 | 505 | save_pointer(NAME(m_h1_vram), VRAM_SIZE); |
| 506 | 506 | save_pointer(NAME(m_h1_pcg), VRAM_SIZE); |
| r21404 | r21405 | |
| 548 | 548 | xisrc = (xdst + scrollx) & (xi_mask); |
| 549 | 549 | yisrc = (ydst + scrolly) & (yi_mask); |
| 550 | 550 | src_offs = (xsrc + (ysrc*xsize)); |
| 551 | | src_offs *= 2; |
| 552 | 551 | src_offs += base_offset; |
| 553 | 552 | |
| 554 | | cur_tile = (m_h1_vram[src_offs]<<8)|m_h1_vram[src_offs+1]; |
| 553 | cur_tile = m_h1_vram[src_offs]; |
| 555 | 554 | |
| 556 | 555 | tile = cur_tile & 0x07ff; |
| 557 | 556 | color = m_color + ((cur_tile & 0x0800) >> 11) * 4; |
| 558 | 557 | |
| 559 | 558 | /* we have a tile number, fetch into the PCG RAM */ |
| 560 | 559 | pcg_offs = (xisrc+yisrc*xi_size)+tile*xi_size*yi_size; |
| 561 | | dot_data = m_h1_pcg[pcg_offs] & 0xff; |
| 560 | dot_data = m_h1_pcg[pcg_offs/2]; |
| 561 | dot_data>>= ((pcg_offs & 1) ^ 1) * 8; |
| 562 | dot_data&= 0xff; |
| 562 | 563 | dot_data+= color<<8; |
| 563 | | dot_data*= 2; |
| 564 | 564 | |
| 565 | 565 | /* finally, take the palette data (TODO: apply RGB control) */ |
| 566 | | pal_data = m_h1_pal[dot_data]<<8|m_h1_pal[dot_data+1]; |
| 566 | pal_data = m_h1_pal[dot_data]; |
| 567 | 567 | r = pal5bit((pal_data >> 10) & 0x1f); |
| 568 | 568 | g = pal5bit((pal_data >> 5) & 0x1f); |
| 569 | 569 | b = pal5bit((pal_data >> 0) & 0x1f); |
| r21404 | r21405 | |
| 1515 | 1515 | UINT8 end_dma_mark; |
| 1516 | 1516 | UINT8 cmd; |
| 1517 | 1517 | UINT8 is_dma; |
| 1518 | UINT16 *dst_ptr; |
| 1518 | 1519 | |
| 1519 | 1520 | end_dma_mark = 0; |
| 1520 | 1521 | |
| r21404 | r21405 | |
| 1535 | 1536 | size = m_framebuffer_vram[(8+dma_index)/4]; |
| 1536 | 1537 | if(dst & 0xfff00000) |
| 1537 | 1538 | printf("unk values to %02x dst %08x\n",cmd,dst); |
| 1538 | | dst &= 0x000fffff; |
| 1539 | dst_ptr = m_h1_vram; |
| 1540 | dst &= 0x000ffffe; |
| 1541 | dst >>= 1; |
| 1539 | 1542 | is_dma = 1; |
| 1540 | 1543 | dma_index+=0xc; |
| 1541 | 1544 | break; |
| r21404 | r21405 | |
| 1546 | 1549 | size = m_framebuffer_vram[(8+dma_index)/4]; |
| 1547 | 1550 | if(dst & 0xfff00000) |
| 1548 | 1551 | printf("unk values to %02x dst %08x\n",cmd,dst); |
| 1549 | | dst &= 0x000fffff; |
| 1550 | | is_dma = 3; |
| 1551 | | //printf("%08x %08x %08x %02x\n",src,dst,size,cmd); |
| 1552 | dst_ptr = m_h1_pcg; |
| 1553 | dst &= 0x000ffffe; |
| 1554 | dst >>= 1; |
| 1555 | is_dma = 1; |
| 1552 | 1556 | dma_index+=0xc; |
| 1553 | 1557 | break; |
| 1554 | 1558 | |
| r21404 | r21405 | |
| 1559 | 1563 | /* Note: there are also some reads at 0x3e00000. This tells us that the DMA thing actually mirrors at 0x3c00000 too. */ |
| 1560 | 1564 | if(dst & 0xfff00000) |
| 1561 | 1565 | printf("unk values to %02x dst %08x\n",cmd,dst); |
| 1562 | | dst &= 0x000fffff; |
| 1563 | | is_dma = 2; |
| 1564 | | //printf("%08x %08x %08x %02x\n",src,dst,size,cmd); |
| 1566 | dst_ptr = m_h1_pal; |
| 1567 | dst &= 0x000ffffe; |
| 1568 | dst >>= 1; |
| 1569 | is_dma = 1; |
| 1565 | 1570 | dma_index+=0xc; |
| 1566 | 1571 | break; |
| 1567 | 1572 | |
| r21404 | r21405 | |
| 1584 | 1589 | break; |
| 1585 | 1590 | } |
| 1586 | 1591 | |
| 1587 | | /* TODO: clean-up at a later stage (once that I properly rewrite everything) */ |
| 1588 | | if(is_dma == 1) |
| 1592 | if(is_dma) |
| 1589 | 1593 | { |
| 1590 | | UINT16 read_src; |
| 1591 | | |
| 1592 | 1594 | for(int i=0;i<size;i+=2) |
| 1593 | 1595 | { |
| 1594 | | read_src = space.read_word(src); |
| 1595 | | |
| 1596 | | m_h1_vram[dst] = read_src >> 8; |
| 1597 | | m_h1_vram[dst+1] = read_src & 0xff; |
| 1598 | | dst+=2; |
| 1596 | dst_ptr[dst] = space.read_word(src); |
| 1597 | dst++; |
| 1599 | 1598 | src+=2; |
| 1600 | 1599 | } |
| 1601 | 1600 | } |
| 1602 | | else if(is_dma == 2) |
| 1603 | | { |
| 1604 | | UINT16 read_src; |
| 1605 | 1601 | |
| 1606 | | for(int i=0;i<size;i+=2) |
| 1607 | | { |
| 1608 | | read_src = space.read_word(src); |
| 1609 | | |
| 1610 | | m_h1_pal[dst] = read_src >> 8; |
| 1611 | | m_h1_pal[dst+1] = read_src & 0xff; |
| 1612 | | dst+=2; |
| 1613 | | src+=2; |
| 1614 | | } |
| 1615 | | } |
| 1616 | | else if(is_dma == 3) |
| 1617 | | { |
| 1618 | | UINT16 read_src; |
| 1619 | | |
| 1620 | | for(int i=0;i<size;i+=2) |
| 1621 | | { |
| 1622 | | read_src = space.read_word(src); |
| 1623 | | |
| 1624 | | m_h1_pcg[dst] = read_src >> 8; |
| 1625 | | m_h1_pcg[dst+1] = read_src & 0xff; |
| 1626 | | dst+=2; |
| 1627 | | src+=2; |
| 1628 | | } |
| 1629 | | } |
| 1630 | | |
| 1631 | 1602 | }while(!end_dma_mark ); |
| 1632 | 1603 | } |
| 1633 | 1604 | |