trunk/src/mess/video/gime.c
| r19986 | r19987 | |
| 119 | 119 | |
| 120 | 120 | void gime_base_device::device_start(void) |
| 121 | 121 | { |
| 122 | | /* get the config */ |
| 122 | // get the config |
| 123 | 123 | const gime_interface *config = (const gime_interface *) static_config(); |
| 124 | 124 | assert(config); |
| 125 | 125 | |
| 126 | | /* find the RAM device - make sure that it is started */ |
| 126 | // find the RAM device - make sure that it is started |
| 127 | 127 | m_ram = machine().device<ram_device>(config->m_ram_tag); |
| 128 | 128 | if (!m_ram->started()) |
| 129 | 129 | throw device_missing_dependencies(); |
| 130 | 130 | |
| 131 | | /* find the CART device - make sure that it is started */ |
| 131 | // find the CART device - make sure that it is started |
| 132 | 132 | m_cart_device = machine().device<cococart_slot_device>(config->m_ext_tag); |
| 133 | 133 | if (!m_cart_device->started()) |
| 134 | 134 | throw device_missing_dependencies(); |
| 135 | 135 | |
| 136 | | /* find the CPU device - make sure that it is started */ |
| 136 | // find the CPU device - make sure that it is started |
| 137 | 137 | m_cpu = machine().device<cpu_device>(config->m_maincpu_tag); |
| 138 | 138 | if (!m_cpu->started()) |
| 139 | 139 | throw device_missing_dependencies(); |
| 140 | 140 | |
| 141 | | /* inherited device_start - need to do this after checking dependencies */ |
| 141 | // inherited device_start - need to do this after checking dependencies |
| 142 | 142 | super::device_start(); |
| 143 | 143 | |
| 144 | | /* initialize variables */ |
| 144 | // initialize variables |
| 145 | 145 | memset(m_scanlines, 0, sizeof(m_scanlines)); |
| 146 | 146 | m_interrupt_value = 0x00; |
| 147 | 147 | m_irq = 0x00; |
| 148 | 148 | m_firq = 0x00; |
| 149 | 149 | |
| 150 | | /* allocate timer */ |
| 150 | // allocate timer |
| 151 | 151 | m_gime_clock_timer = timer_alloc(TIMER_GIME_CLOCK); |
| 152 | 152 | |
| 153 | | /* resolve callbacks */ |
| 153 | // setup banks |
| 154 | assert(ARRAY_LENGTH(m_read_banks) == ARRAY_LENGTH(m_write_banks)); |
| 155 | for (int i = 0; i < ARRAY_LENGTH(m_read_banks); i++) |
| 156 | { |
| 157 | char buffer[8]; |
| 158 | snprintf(buffer, ARRAY_LENGTH(buffer), "rbank%d", i); |
| 159 | m_read_banks[i] = machine().root_device().membank(buffer); |
| 160 | snprintf(buffer, ARRAY_LENGTH(buffer), "wbank%d", i); |
| 161 | m_write_banks[i] = machine().root_device().membank(buffer); |
| 162 | } |
| 163 | |
| 164 | // resolve callbacks |
| 154 | 165 | m_res_out_hsync_func.resolve(config->m_out_hsync_func, *this); |
| 155 | 166 | m_res_out_fsync_func.resolve(config->m_out_fsync_func, *this); |
| 156 | 167 | m_res_out_irq_func.resolve(config->m_out_irq_func, *this); |
| 157 | 168 | m_res_out_firq_func.resolve(config->m_out_firq_func, *this); |
| 158 | 169 | m_res_in_floating_bus_func.resolve(config->m_in_floating_bus_func, *this); |
| 159 | 170 | |
| 160 | | /* set up ROM/RAM pointers */ |
| 171 | // set up ROM/RAM pointers |
| 161 | 172 | m_rom = machine().root_device().memregion(config->m_maincpu_tag)->base(); |
| 162 | 173 | m_cart_rom = m_cart_device->get_cart_base(); |
| 163 | 174 | |
| 164 | | /* populate palettes */ |
| 175 | // populate palettes |
| 165 | 176 | for (int color = 0; color < 64; color++) |
| 166 | 177 | { |
| 167 | 178 | m_composite_palette[color] = get_composite_color(color); |
| r19986 | r19987 | |
| 169 | 180 | m_rgb_palette[color] = get_rgb_color(color); |
| 170 | 181 | } |
| 171 | 182 | |
| 172 | | /* set up save states */ |
| 183 | // set up save states |
| 173 | 184 | save_pointer(NAME(m_gime_registers), ARRAY_LENGTH(m_gime_registers)); |
| 174 | 185 | save_pointer(NAME(m_mmu), ARRAY_LENGTH(m_mmu)); |
| 175 | 186 | save_item(NAME(m_sam_state)); |
| r19986 | r19987 | |
| 523 | 534 | |
| 524 | 535 | void gime_base_device::update_memory(int bank) |
| 525 | 536 | { |
| 526 | | static const char *rbanks[] = { "rbank0", "rbank1", "rbank2", "rbank3", "rbank4", "rbank5", "rbank6", "rbank7", "rbank8" }; |
| 527 | | static const char *wbanks[] = { "wbank0", "wbank1", "wbank2", "wbank3", "wbank4", "wbank5", "wbank6", "wbank7", "wbank8" }; |
| 537 | // choose bank |
| 538 | assert((bank >= 0) && (bank < ARRAY_LENGTH(m_read_banks)) && (bank < ARRAY_LENGTH(m_write_banks))); |
| 539 | memory_bank *read_bank = m_read_banks[bank]; |
| 540 | memory_bank *write_bank = m_write_banks[bank]; |
| 528 | 541 | |
| 529 | | /* look up the bank tags */ |
| 530 | | assert((bank >= 0) && (bank < ARRAY_LENGTH(rbanks)) && (bank < ARRAY_LENGTH(wbanks))); |
| 531 | | const char *rbank = rbanks[bank]; |
| 532 | | const char *wbank = wbanks[bank]; |
| 533 | | |
| 534 | | /* bank 8 is really $FE00-$FEFF; it is weird so adjust for it */ |
| 542 | // bank 8 is really $FE00-$FEFF; it is weird so adjust for it |
| 535 | 543 | offs_t offset; |
| 536 | 544 | bool force_ram; |
| 537 | 545 | bool enable_mmu = (m_gime_registers[0] & 0x40) ? true : false; |
| r19986 | r19987 | |
| 548 | 556 | force_ram = false; |
| 549 | 557 | } |
| 550 | 558 | |
| 551 | | /* is the MMU enabled at $FF90? */ |
| 559 | // is the MMU enabled at $FF90? |
| 552 | 560 | int block; |
| 553 | 561 | if (enable_mmu) |
| 554 | 562 | { |
| 555 | | /* check TR register at $FF91 */ |
| 563 | // check TR register at $FF91 |
| 556 | 564 | bank += (m_gime_registers[1] & 0x01) ? 8 : 0; |
| 557 | 565 | |
| 558 | | /* perform the MMU lookup */ |
| 566 | // perform the MMU lookup |
| 559 | 567 | block = m_mmu[bank]; |
| 560 | 568 | |
| 561 | | /* also check $FF9B - relevant for the 2-8 MB upgrade */ |
| 569 | // also check $FF9B - relevant for the 2-8 MB upgrade |
| 562 | 570 | block |= ((UINT32) ((m_gime_registers[11] >> 4) & 0x03)) << 8; |
| 563 | 571 | } |
| 564 | 572 | else |
| 565 | 573 | { |
| 566 | | /* the MMU is not enabled */ |
| 574 | // the MMU is not enabled |
| 567 | 575 | block = bank + 56; |
| 568 | 576 | } |
| 569 | 577 | |
| 570 | | /* are we actually in ROM? */ |
| 578 | // are we actually in ROM? |
| 571 | 579 | UINT8 *memory; |
| 572 | 580 | bool is_read_only; |
| 573 | 581 | if (((block & 0x3F) >= 0x3C) && !(m_sam_state & SAM_STATE_TY) && !force_ram) |
| 574 | 582 | { |
| 575 | | /* we're in ROM */ |
| 583 | // we're in ROM |
| 576 | 584 | static const UINT8 rom_map[4][4] = |
| 577 | 585 | { |
| 578 | 586 | { 0, 1, 6, 7 }, |
| r19986 | r19987 | |
| 581 | 589 | { 4, 5, 6, 7 } |
| 582 | 590 | }; |
| 583 | 591 | |
| 584 | | /* look up the block in the ROM map */ |
| 592 | // look up the block in the ROM map |
| 585 | 593 | block = rom_map[m_gime_registers[0] & 3][(block & 0x3F) - 0x3C]; |
| 586 | 594 | |
| 587 | | /* are we in onboard ROM or cart ROM? */ |
| 595 | // are we in onboard ROM or cart ROM? |
| 588 | 596 | UINT8 *rom_ptr = (block & 4) ? m_cart_rom : m_rom; |
| 589 | | /* TODO: make this unmapped */ |
| 597 | // TODO: make this unmapped |
| 590 | 598 | if (rom_ptr==NULL) rom_ptr = m_rom; |
| 591 | | /* perform the look up */ |
| 599 | // perform the look up |
| 592 | 600 | memory = &rom_ptr[(block & 3) * 0x2000]; |
| 593 | 601 | is_read_only = true; |
| 594 | 602 | } |
| 595 | 603 | else |
| 596 | 604 | { |
| 597 | | /* we're in RAM */ |
| 605 | // we're in RAM |
| 598 | 606 | memory = memory_pointer(block * 0x2000); |
| 599 | 607 | is_read_only = false; |
| 600 | 608 | } |
| 601 | 609 | |
| 602 | | /* compensate for offset */ |
| 610 | // compensate for offset |
| 603 | 611 | memory += offset; |
| 604 | 612 | |
| 605 | | /* set the banks */ |
| 606 | | machine().root_device().membank(rbank)->set_base(memory); |
| 607 | | machine().root_device().membank(wbank)->set_base(is_read_only ? m_dummy_bank : memory); |
| 613 | // set the banks |
| 614 | read_bank->set_base(memory); |
| 615 | write_bank->set_base(is_read_only ? m_dummy_bank : memory); |
| 608 | 616 | } |
| 609 | 617 | |
| 610 | 618 | |
trunk/src/mess/video/gime.h
| r19986 | r19987 | |
| 155 | 155 | static const UINT8 hires_font[128][12]; |
| 156 | 156 | |
| 157 | 157 | // callbacks |
| 158 | | devcb_resolved_write_line m_res_out_irq_func; |
| 159 | | devcb_resolved_write_line m_res_out_firq_func; |
| 160 | | devcb_resolved_read8 m_res_in_floating_bus_func; |
| 158 | devcb_resolved_write_line m_res_out_irq_func; |
| 159 | devcb_resolved_write_line m_res_out_firq_func; |
| 160 | devcb_resolved_read8 m_res_in_floating_bus_func; |
| 161 | 161 | |
| 162 | 162 | // device state |
| 163 | | UINT8 m_gime_registers[16]; |
| 164 | | UINT8 m_mmu[16]; |
| 165 | | UINT8 m_ff22_value; |
| 166 | | UINT8 m_interrupt_value; |
| 167 | | UINT8 m_irq; |
| 168 | | UINT8 m_firq; |
| 169 | | UINT16 m_timer_value; |
| 170 | | bool m_is_blinking; |
| 163 | UINT8 m_gime_registers[16]; |
| 164 | UINT8 m_mmu[16]; |
| 165 | UINT8 m_ff22_value; |
| 166 | UINT8 m_interrupt_value; |
| 167 | UINT8 m_irq; |
| 168 | UINT8 m_firq; |
| 169 | UINT16 m_timer_value; |
| 170 | bool m_is_blinking; |
| 171 | 171 | |
| 172 | 172 | // video state |
| 173 | | bool m_legacy_video; |
| 174 | | UINT32 m_video_position; |
| 175 | | UINT8 m_line_in_row; |
| 176 | | scanline_record m_scanlines[25+192+26]; |
| 177 | | bool m_displayed_rgb; |
| 173 | bool m_legacy_video; |
| 174 | UINT32 m_video_position; |
| 175 | UINT8 m_line_in_row; |
| 176 | scanline_record m_scanlines[25+192+26]; |
| 177 | bool m_displayed_rgb; |
| 178 | 178 | |
| 179 | 179 | // palette state |
| 180 | | UINT8 m_palette_rotated[1024][16]; |
| 181 | | UINT16 m_palette_rotated_position; |
| 182 | | bool m_palette_rotated_position_used; |
| 180 | UINT8 m_palette_rotated[1024][16]; |
| 181 | UINT16 m_palette_rotated_position; |
| 182 | bool m_palette_rotated_position_used; |
| 183 | 183 | |
| 184 | 184 | // incidentals |
| 185 | | ram_device *m_ram; |
| 186 | | emu_timer *m_gime_clock_timer; |
| 187 | | cococart_slot_device *m_cart_device; |
| 188 | | UINT8 *m_rom; |
| 189 | | UINT8 *m_cart_rom; |
| 190 | | pixel_t m_composite_palette[64]; |
| 191 | | pixel_t m_composite_bw_palette[64]; |
| 192 | | pixel_t m_rgb_palette[64]; |
| 193 | | UINT8 m_dummy_bank[0x2000]; |
| 185 | ram_device * m_ram; |
| 186 | emu_timer * m_gime_clock_timer; |
| 187 | cococart_slot_device * m_cart_device; |
| 188 | memory_bank * m_read_banks[9]; |
| 189 | memory_bank * m_write_banks[9]; |
| 190 | UINT8 * m_rom; |
| 191 | UINT8 * m_cart_rom; |
| 192 | pixel_t m_composite_palette[64]; |
| 193 | pixel_t m_composite_bw_palette[64]; |
| 194 | pixel_t m_rgb_palette[64]; |
| 195 | UINT8 m_dummy_bank[0x2000]; |
| 194 | 196 | |
| 195 | 197 | // timer constants |
| 196 | 198 | static const device_timer_id TIMER_FRAME = 0; |