trunk/src/mess/drivers/pc9801.c
| r19470 | r19471 | |
| 44 | 44 | |
| 45 | 45 | List of per-game TODO: |
| 46 | 46 | - 4D Boxing: inputs are unresponsive |
| 47 | (A Midsummer ...) |
| 47 | 48 | - Absolutely Mahjong: Kanji data doesn't appear at the Epson logo. Transitions are too fast. |
| 48 | 49 | - Brandish 2: Intro needs some window masking effects; |
| 49 | 50 | - Dragon Buster: missing bitplanes for the PCG (or not?), slight issue with window masking; |
| r19470 | r19471 | |
| 312 | 313 | UINT8 *m_ext_work_ram; |
| 313 | 314 | UINT8 *m_char_rom; |
| 314 | 315 | UINT8 *m_kanji_rom; |
| 315 | | UINT8 *m_pcg_ram; |
| 316 | 316 | |
| 317 | 317 | UINT8 m_portb_tmp; |
| 318 | 318 | UINT8 m_dma_offset[4]; |
| r19470 | r19471 | |
| 579 | 579 | // find memory regions |
| 580 | 580 | m_char_rom = memregion("chargen")->base(); |
| 581 | 581 | m_kanji_rom = memregion("kanji")->base(); |
| 582 | | |
| 583 | | m_pcg_ram = auto_alloc_array(machine(), UINT8, 0x200000); |
| 584 | | |
| 585 | | state_save_register_global_pointer(machine(), m_pcg_ram, 0x200000); |
| 586 | 582 | } |
| 587 | 583 | |
| 588 | 584 | UINT32 pc9801_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) |
| r19470 | r19471 | |
| 663 | 659 | UINT8 char_size; |
| 664 | 660 | // UINT8 interlace_on; |
| 665 | 661 | UINT16 tile; |
| 666 | | UINT8 pcg_sel, pcg_lr; |
| 662 | UINT8 kanji_lr; |
| 667 | 663 | UINT8 kanji_sel; |
| 668 | 664 | |
| 669 | 665 | if(state->m_video_ff[DISPLAY_REG] == 0) //screen is off |
| r19470 | r19471 | |
| 684 | 680 | |
| 685 | 681 | tile_addr = addr+(x*(state->m_video_ff[WIDTH40_REG]+1)); |
| 686 | 682 | |
| 687 | | pcg_sel = 0; |
| 688 | 683 | kanji_sel = 0; |
| 689 | | pcg_lr = 0; |
| 684 | kanji_lr = 0; |
| 690 | 685 | |
| 691 | 686 | tile = state->m_video_ram_1[(tile_addr*2) & 0x1fff] & 0xff; |
| 692 | 687 | knj_tile = state->m_video_ram_1[(tile_addr*2+1) & 0x1fff] & 0xff; |
| 693 | | if((tile == 0x56 || tile == 0x57) && knj_tile) |
| 688 | if(knj_tile) |
| 694 | 689 | { |
| 695 | | pcg_sel = 1; |
| 696 | | tile = knj_tile & 0x7f; |
| 697 | | pcg_lr = (knj_tile & 0x80) >> 7; |
| 698 | | } |
| 699 | | else if(knj_tile) // kanji select, TODO |
| 700 | | { |
| 701 | | pcg_lr = (knj_tile & 0x80) >> 7; |
| 702 | | pcg_lr |= (tile & 0x80) >> 7; // Tokimeki Sports Gal 3 |
| 690 | kanji_lr = (knj_tile & 0x80) >> 7; |
| 691 | kanji_lr |= (tile & 0x80) >> 7; // Tokimeki Sports Gal 3 |
| 703 | 692 | tile &= 0x7f; |
| 704 | 693 | tile <<= 8; |
| 705 | 694 | tile |= (knj_tile & 0x7f); |
| 706 | | /* annoying kanji bit-swap applied on the address bus ... */ |
| 707 | | // tile = BITSWAP16(tile,15,7,14,13,12,11,6,5,10,9,8,4,3,2,1,0); |
| 708 | | // tile&=0x7fff; |
| 709 | 695 | kanji_sel = 1; |
| 710 | 696 | } |
| 711 | 697 | attr = (state->m_video_ram_1[(tile_addr*2 & 0x1fff) | 0x2000] & 0xff); |
| r19470 | r19471 | |
| 758 | 744 | tile_data = ((tile >> gfx_bit) & 1) ? 0xff : 0x00; |
| 759 | 745 | } |
| 760 | 746 | else if(kanji_sel) |
| 761 | | tile_data = (state->m_kanji_rom[tile*0x20+yi*2+pcg_lr]); |
| 762 | | else if(pcg_sel) |
| 763 | | tile_data = (state->m_pcg_ram[0xac000+tile*0x20+yi*2+pcg_lr]); |
| 747 | tile_data = (state->m_kanji_rom[tile*0x20+yi*2+kanji_lr]); |
| 764 | 748 | else |
| 765 | 749 | tile_data = (state->m_char_rom[tile*char_size+state->m_video_ff[FONTSEL_REG]*0x800+yi]); |
| 766 | 750 | } |
| r19470 | r19471 | |
| 774 | 758 | |
| 775 | 759 | if(yi >= char_size) |
| 776 | 760 | pen = 0; |
| 777 | | else if(pcg_sel) |
| 778 | | { |
| 779 | | pen = 0; |
| 780 | | if(color & 1) pen |= ((tile_data >> (7-xi) & 1) ? 1 : 0); |
| 781 | | if(color & 2) pen |= ((tile_data >> (7-xi) & 1) ? 2 : 0); |
| 782 | | if(color & 4) pen |= ((tile_data >> (7-xi) & 1) ? 4 : 0); |
| 783 | | } |
| 784 | 761 | else |
| 785 | 762 | pen = (tile_data >> (7-xi) & 1) ? color : 0; |
| 786 | 763 | |
| r19470 | r19471 | |
| 1231 | 1208 | pcg_offset = m_font_addr << 5; |
| 1232 | 1209 | pcg_offset|= m_font_line; |
| 1233 | 1210 | pcg_offset|= m_font_lr; |
| 1234 | | if((m_font_addr & 0xff00) == 0x5600 || (m_font_addr & 0xff00) == 0x5700) |
| 1235 | | { |
| 1236 | | return m_pcg_ram[pcg_offset]; |
| 1237 | | } |
| 1238 | 1211 | |
| 1239 | 1212 | /* TODO: Brandish 2 accesses a 0008a561 kanji address, obviously causing a crash. */ |
| 1240 | 1213 | // if(pcg_offset >= 0x80000) |
| r19470 | r19471 | |
| 1314 | 1287 | //printf("%04x %02x %02x %08x\n",m_font_addr,m_font_line,m_font_lr,pcg_offset); |
| 1315 | 1288 | if((m_font_addr & 0xff00) == 0x5600 || (m_font_addr & 0xff00) == 0x5700) |
| 1316 | 1289 | { |
| 1317 | | m_pcg_ram[pcg_offset] = data; |
| 1290 | m_kanji_rom[pcg_offset] = data; |
| 1291 | machine().gfx[2]->mark_dirty(pcg_offset >> 5); |
| 1318 | 1292 | } |
| 1319 | 1293 | return; |
| 1320 | 1294 | } |
| r19470 | r19471 | |
| 1638 | 1612 | pcg_offset|= offset & 0x1e; |
| 1639 | 1613 | pcg_offset|= m_font_lr; |
| 1640 | 1614 | |
| 1615 | /* TODO: investigate on this difference */ |
| 1641 | 1616 | if((m_font_addr & 0xff00) == 0x5600 || (m_font_addr & 0xff00) == 0x5700) |
| 1642 | | return m_pcg_ram[pcg_offset]; |
| 1617 | return m_kanji_rom[pcg_offset]; |
| 1643 | 1618 | |
| 1644 | 1619 | pcg_offset = m_font_addr << 5; |
| 1645 | 1620 | pcg_offset|= offset & 0x1f; |
| r19470 | r19471 | |
| 1657 | 1632 | pcg_offset|= m_font_lr; |
| 1658 | 1633 | |
| 1659 | 1634 | if((m_font_addr & 0xff00) == 0x5600 || (m_font_addr & 0xff00) == 0x5700) |
| 1660 | | m_pcg_ram[pcg_offset] = data; |
| 1635 | { |
| 1636 | m_kanji_rom[pcg_offset] = data; |
| 1637 | machine().gfx[2]->mark_dirty(pcg_offset >> 5); |
| 1638 | } |
| 1661 | 1639 | } |
| 1662 | 1640 | |
| 1663 | 1641 | /* FF-based */ |