trunk/src/mame/drivers/neogeo.c
| r20896 | r20897 | |
| 1309 | 1309 | machine().memory().region_free(":fixed"); |
| 1310 | 1310 | machine().memory().region_alloc(":fixed",size,1, ENDIANNESS_LITTLE); |
| 1311 | 1311 | memcpy(memregion("fixed")->base(),image.get_software_region("fixed"),size); |
| 1312 | m_region_fixed.findit(); |
| 1312 | 1313 | |
| 1313 | 1314 | if(image.get_software_region("audiocpu") != NULL) |
| 1314 | 1315 | { |
| r20896 | r20897 | |
| 1338 | 1339 | machine().memory().region_free(":sprites"); |
| 1339 | 1340 | machine().memory().region_alloc(":sprites",size,1, ENDIANNESS_LITTLE); |
| 1340 | 1341 | memcpy(machine().root_device().memregion("sprites")->base(),image.get_software_region("sprites"),size); |
| 1342 | // Reset the reference to the region |
| 1343 | m_region_sprites.findit(); |
| 1341 | 1344 | if(image.get_software_region("audiocrypt") != NULL) // encrypted Z80 code |
| 1342 | 1345 | { |
| 1343 | 1346 | size = image.get_software_region_length("audiocrypt"); |
trunk/src/mame/includes/neogeo.h
| r20896 | r20897 | |
| 42 | 42 | , m_audiocpu(*this, "audiocpu") |
| 43 | 43 | , m_upd4990a(*this, "upd4990a") |
| 44 | 44 | , m_region_maincpu(*this, "maincpu") |
| 45 | , m_region_sprites(*this, "sprites") |
| 46 | , m_region_fixed(*this, "fixed") |
| 47 | , m_region_fixedbios(*this, "fixedbios") |
| 45 | 48 | , m_bank_vectors(*this, NEOGEO_BANK_VECTORS) |
| 46 | 49 | , m_bank_bios(*this, NEOGEO_BANK_BIOS) |
| 47 | 50 | , m_bank_cartridge(*this, NEOGEO_BANK_CARTRIDGE) |
| r20896 | r20897 | |
| 262 | 265 | |
| 263 | 266 | protected: |
| 264 | 267 | required_memory_region m_region_maincpu; |
| 268 | required_memory_region m_region_sprites; |
| 269 | required_memory_region m_region_fixed; |
| 270 | required_memory_region m_region_fixedbios; |
| 265 | 271 | required_memory_bank m_bank_vectors; |
| 266 | 272 | required_memory_bank m_bank_bios; |
| 267 | 273 | optional_memory_bank m_bank_cartridge; // optional because of neocd |
| r20896 | r20897 | |
| 283 | 289 | void _set_audio_cpu_rom_source(); |
| 284 | 290 | void set_audio_cpu_rom_source( UINT8 data ); |
| 285 | 291 | void _set_main_cpu_vector_table_source(); |
| 292 | void optimize_sprite_data(); |
| 293 | void draw_fixed_layer( bitmap_rgb32 &bitmap, int scanline ); |
| 286 | 294 | }; |
| 287 | 295 | |
| 288 | 296 | |
trunk/src/mame/video/neogeo.c
| r20896 | r20897 | |
| 264 | 264 | } |
| 265 | 265 | |
| 266 | 266 | |
| 267 | | static void draw_fixed_layer( running_machine &machine, bitmap_rgb32 &bitmap, int scanline ) |
| 267 | void neogeo_state::draw_fixed_layer( bitmap_rgb32 &bitmap, int scanline ) |
| 268 | 268 | { |
| 269 | | neogeo_state *state = machine.driver_data<neogeo_state>(); |
| 270 | 269 | int x; |
| 271 | 270 | |
| 272 | | UINT8* gfx_base = state->memregion(state->m_fixed_layer_source ? "fixed" : "fixedbios")->base(); |
| 273 | | UINT32 addr_mask = state->memregion(state->m_fixed_layer_source ? "fixed" : "fixedbios")->bytes() - 1; |
| 274 | | UINT16 *video_data = &state->m_videoram[0x7000 | (scanline >> 3)]; |
| 271 | UINT8* gfx_base = m_fixed_layer_source ? m_region_fixed->base() : m_region_fixedbios->base(); |
| 272 | UINT32 addr_mask = ( m_fixed_layer_source ? m_region_fixed->bytes() : m_region_fixedbios->bytes() ) - 1; |
| 273 | UINT16 *video_data = &m_videoram[0x7000 | (scanline >> 3)]; |
| 275 | 274 | UINT32 *pixel_addr = &bitmap.pix32(scanline, NEOGEO_HBEND); |
| 276 | 275 | |
| 277 | 276 | int garouoffsets[32]; |
| 278 | | int banked = state->m_fixed_layer_source && (addr_mask > 0x1ffff); |
| 277 | int banked = m_fixed_layer_source && (addr_mask > 0x1ffff); |
| 279 | 278 | |
| 280 | 279 | /* thanks to Mr K for the garou & kof2000 banking info */ |
| 281 | 280 | /* Build line banking table for Garou & MS3 before starting render */ |
| 282 | | if (banked && state->m_fixed_layer_bank_type == 1) |
| 281 | if (banked && m_fixed_layer_bank_type == 1) |
| 283 | 282 | { |
| 284 | 283 | int garoubank = 0; |
| 285 | 284 | int k = 0; |
| 286 | 285 | int y = 0; |
| 287 | 286 | while (y < 32) |
| 288 | 287 | { |
| 289 | | if (state->m_videoram[0x7500 + k] == 0x0200 && (state->m_videoram[0x7580 + k] & 0xff00) == 0xff00) |
| 288 | if (m_videoram[0x7500 + k] == 0x0200 && (m_videoram[0x7580 + k] & 0xff00) == 0xff00) |
| 290 | 289 | { |
| 291 | | garoubank = state->m_videoram[0x7580 + k] & 3; |
| 290 | garoubank = m_videoram[0x7580 + k] & 3; |
| 292 | 291 | garouoffsets[y++] = garoubank; |
| 293 | 292 | } |
| 294 | 293 | garouoffsets[y++] = garoubank; |
| r20896 | r20897 | |
| 304 | 303 | if (banked) |
| 305 | 304 | { |
| 306 | 305 | int y = scanline >> 3; |
| 307 | | switch (state->m_fixed_layer_bank_type) |
| 306 | switch (m_fixed_layer_bank_type) |
| 308 | 307 | { |
| 309 | 308 | case 1: |
| 310 | 309 | /* Garou, MSlug 3 */ |
| 311 | 310 | code += 0x1000 * (garouoffsets[(y - 2) & 31] ^ 3); |
| 312 | 311 | break; |
| 313 | 312 | case 2: |
| 314 | | code += 0x1000 * (((state->m_videoram[0x7500 + ((y - 1) & 31) + 32 * (x / 6)] >> (5 - (x % 6)) * 2) & 3) ^ 3); |
| 313 | code += 0x1000 * (((m_videoram[0x7500 + ((y - 1) & 31) + 32 * (x / 6)] >> (5 - (x % 6)) * 2) & 3) ^ 3); |
| 315 | 314 | break; |
| 316 | 315 | } |
| 317 | 316 | } |
| r20896 | r20897 | |
| 321 | 320 | int i; |
| 322 | 321 | |
| 323 | 322 | UINT8 *gfx = &gfx_base[((code << 5) | (scanline & 0x07)) & addr_mask]; |
| 324 | | pen_t *char_pens = &state->m_pens[code_and_palette >> 12 << 4]; |
| 323 | pen_t *char_pens = &m_pens[code_and_palette >> 12 << 4]; |
| 325 | 324 | |
| 326 | 325 | for (i = 0; i < 4; i++) |
| 327 | 326 | { |
| r20896 | r20897 | |
| 670 | 669 | } |
| 671 | 670 | |
| 672 | 671 | |
| 673 | | static void optimize_sprite_data( running_machine &machine ) |
| 672 | void neogeo_state::optimize_sprite_data() |
| 674 | 673 | { |
| 675 | | neogeo_state *state = machine.driver_data<neogeo_state>(); |
| 676 | | |
| 677 | 674 | /* convert the sprite graphics data into a format that |
| 678 | 675 | allows faster blitting */ |
| 679 | 676 | int i; |
| r20896 | r20897 | |
| 684 | 681 | |
| 685 | 682 | /* get mask based on the length rounded up to the nearest |
| 686 | 683 | power of 2 */ |
| 687 | | state->m_sprite_gfx_address_mask = 0xffffffff; |
| 684 | m_sprite_gfx_address_mask = 0xffffffff; |
| 688 | 685 | |
| 689 | | len = state->memregion("sprites")->bytes(); |
| 686 | len = m_region_sprites->bytes(); |
| 690 | 687 | |
| 691 | 688 | for (bit = 0x80000000; bit != 0; bit >>= 1) |
| 692 | 689 | { |
| 693 | 690 | if (((len * 2) - 1) & bit) |
| 694 | 691 | break; |
| 695 | 692 | |
| 696 | | state->m_sprite_gfx_address_mask >>= 1; |
| 693 | m_sprite_gfx_address_mask >>= 1; |
| 697 | 694 | } |
| 698 | 695 | |
| 699 | | state->m_sprite_gfx = auto_alloc_array_clear(machine, UINT8, state->m_sprite_gfx_address_mask + 1); |
| 696 | m_sprite_gfx = auto_alloc_array_clear(machine(), UINT8, m_sprite_gfx_address_mask + 1); |
| 700 | 697 | |
| 701 | | src = machine.root_device().memregion("sprites")->base(); |
| 702 | | dest = state->m_sprite_gfx; |
| 698 | src = m_region_sprites->base(); |
| 699 | dest = m_sprite_gfx; |
| 703 | 700 | |
| 704 | 701 | for (i = 0; i < len; i += 0x80, src += 0x80) |
| 705 | 702 | { |
| r20896 | r20897 | |
| 859 | 856 | compute_rgb_weights(machine()); |
| 860 | 857 | create_sprite_line_timer(machine()); |
| 861 | 858 | create_auto_animation_timer(machine()); |
| 862 | | optimize_sprite_data(machine()); |
| 859 | optimize_sprite_data(); |
| 863 | 860 | |
| 864 | 861 | /* initialize values that are not modified on a reset */ |
| 865 | 862 | m_videoram_read_buffer = 0; |
| r20896 | r20897 | |
| 902 | 899 | { |
| 903 | 900 | start_sprite_line_timer(machine()); |
| 904 | 901 | start_auto_animation_timer(machine()); |
| 905 | | optimize_sprite_data(machine()); |
| 902 | optimize_sprite_data(); |
| 906 | 903 | } |
| 907 | 904 | |
| 908 | 905 | |
| r20896 | r20897 | |
| 920 | 917 | |
| 921 | 918 | if (m_has_sprite_bus) draw_sprites(machine(), bitmap, cliprect.min_y); |
| 922 | 919 | |
| 923 | | if (m_has_text_bus) draw_fixed_layer(machine(), bitmap, cliprect.min_y); |
| 920 | if (m_has_text_bus) draw_fixed_layer(bitmap, cliprect.min_y); |
| 924 | 921 | |
| 925 | 922 | return 0; |
| 926 | 923 | } |