trunk/src/mame/drivers/coolridr.c
| r21333 | r21334 | |
| 394 | 394 | UINT16 m_textBytesToWrite; |
| 395 | 395 | INT16 m_blitterSerialCount; |
| 396 | 396 | UINT8 m_blitterMode; |
| 397 | UINT16 m_blitterAddr; |
| 397 | 398 | UINT16 m_textOffset; |
| 398 | 399 | UINT32 m_blitterClearMode; |
| 399 | 400 | INT16 m_blitterClearCount; |
| r21333 | r21334 | |
| 425 | 426 | required_shared_ptr<UINT32> m_sound_dma; |
| 426 | 427 | required_shared_ptr<UINT16> m_soundram; |
| 427 | 428 | required_shared_ptr<UINT16> m_soundram2; |
| 428 | | bitmap_rgb32 m_temp_bitmap_sprites; |
| 429 | | bitmap_rgb32 m_temp_bitmap_sprites2; |
| 429 | bitmap_rgb32 m_temp_bitmap_sprites[4]; |
| 430 | bitmap_rgb32 m_temp_bitmap_sprites2[4]; |
| 430 | 431 | bitmap_rgb32 m_screen1_bitmap; |
| 431 | 432 | bitmap_rgb32 m_screen2_bitmap; |
| 432 | 433 | int m_color; |
| r21333 | r21334 | |
| 489 | 490 | |
| 490 | 491 | void coolridr_state::video_start() |
| 491 | 492 | { |
| 492 | | machine().primary_screen->register_screen_bitmap(m_temp_bitmap_sprites); |
| 493 | | machine().primary_screen->register_screen_bitmap(m_temp_bitmap_sprites2); |
| 493 | machine().primary_screen->register_screen_bitmap(m_temp_bitmap_sprites[0]); |
| 494 | machine().primary_screen->register_screen_bitmap(m_temp_bitmap_sprites2[0]); |
| 495 | |
| 496 | // testing, not right |
| 497 | machine().primary_screen->register_screen_bitmap(m_temp_bitmap_sprites[1]); |
| 498 | machine().primary_screen->register_screen_bitmap(m_temp_bitmap_sprites2[1]); |
| 499 | machine().primary_screen->register_screen_bitmap(m_temp_bitmap_sprites[2]); |
| 500 | machine().primary_screen->register_screen_bitmap(m_temp_bitmap_sprites2[2]); |
| 501 | machine().primary_screen->register_screen_bitmap(m_temp_bitmap_sprites[3]); |
| 502 | machine().primary_screen->register_screen_bitmap(m_temp_bitmap_sprites2[3]); |
| 503 | |
| 494 | 504 | machine().primary_screen->register_screen_bitmap(m_screen1_bitmap); |
| 495 | 505 | machine().primary_screen->register_screen_bitmap(m_screen2_bitmap); |
| 496 | 506 | } |
| r21333 | r21334 | |
| 720 | 730 | /************* m_spriteblit[3] *************/ |
| 721 | 731 | |
| 722 | 732 | UINT32 blit3_unused = m_spriteblit[3] & 0xffe00000; |
| 723 | | UINT32 b3romoffset = (m_spriteblit[3] & 0x001fffff)*2; |
| 724 | | // if this is an offset into the compressed m_spriteblit[3] then it's probably a word offset into each rom (each is 0x400000 bytes) with the m_spriteblit[3] from all 10 being used in parallel as per the notes from Charles |
| 725 | | // this needs verifying as it could instead be an index into some other ram area already decompressed.. |
| 726 | | // 0000xxxx |
| 727 | | // to |
| 728 | | // 001fxxxx |
| 733 | UINT32 b3romoffset = (m_spriteblit[3] & 0x001fffff)*16; |
| 729 | 734 | |
| 730 | | if (blit3_unused) printf("unknown bits in blit word %d - %08x\n", m_blitterSerialCount, blit3_unused); |
| 735 | |
| 736 | if (blit3_unused) printf("unknown bits in blit word %d - %08x\n", 3, blit3_unused); |
| 731 | 737 | |
| 732 | 738 | |
| 733 | 739 | /************* m_spriteblit[4] *************/ |
| r21333 | r21334 | |
| 737 | 743 | UINT32 blit_flipx = m_spriteblit[4] & 0x00000001; |
| 738 | 744 | UINT32 blit_flipy = (m_spriteblit[4] & 0x00000100)>>8; |
| 739 | 745 | UINT32 blit_rotate = (m_spriteblit[4] & 0x00010000)>>16; |
| 740 | | if (blit4_unused) printf("unknown bits in blit word %d - %08x\n", m_blitterSerialCount, blit4_unused); |
| 746 | if (blit4_unused) printf("unknown bits in blit word %d - %08x\n", 4, blit4_unused); |
| 741 | 747 | |
| 742 | 748 | // ---- -111 ---- ---r ---- ---y ---- ---x |
| 743 | 749 | // 1 = used bits? (unknown purpose.. might be object colour mode) |
| r21333 | r21334 | |
| 790 | 796 | |
| 791 | 797 | /************* m_spriteblit[10] *************/ |
| 792 | 798 | |
| 793 | | // this is an address on some objects.. |
| 794 | | // to be specific, the center line of the road (actual road object? which currently gets shown as a single pixel column?) |
| 795 | | // and the horizontal road used in the background of the title screen (which currently looks normal) |
| 796 | | // I guess it's some kind of indirect way to do a line effect? |
| 799 | // pointer to per-line zoom and scroll data for sprites |
| 797 | 800 | UINT32 blit10 = m_spriteblit[10]; |
| 798 | 801 | |
| 799 | 802 | /************* m_spriteblit[11] *************/ |
| r21333 | r21334 | |
| 829 | 832 | |
| 830 | 833 | bitmap_rgb32* drawbitmap; |
| 831 | 834 | |
| 835 | /* test code, not right 0x30 is always text, 0x40 hud, 0x50 99% of game objects and 0x60 some background objects, but it doesn't seem directly priority related*/ |
| 836 | /* |
| 832 | 837 | // 0x30 - 0x60 are definitely the left screen, 0x90 - 0xc0 are definitely the right screen.. the modes seem priority related |
| 833 | 838 | if (m_blitterMode == 0x30 || m_blitterMode == 0x40 || m_blitterMode == 0x50 || m_blitterMode == 0x60) |
| 834 | | drawbitmap = &m_temp_bitmap_sprites; |
| 839 | drawbitmap = &m_temp_bitmap_sprites[(m_blitterMode-0x30)>>4]; |
| 835 | 840 | else // 0x90, 0xa0, 0xb0, 0xc0 |
| 836 | | drawbitmap = &m_temp_bitmap_sprites2; |
| 841 | drawbitmap = &m_temp_bitmap_sprites2[(m_blitterMode-0x90)>>4]; |
| 842 | */ |
| 837 | 843 | |
| 844 | |
| 845 | if (m_blitterMode == 0x30 || m_blitterMode == 0x40 || m_blitterMode == 0x50 || m_blitterMode == 0x60) |
| 846 | drawbitmap = &m_temp_bitmap_sprites[0]; |
| 847 | else // 0x90, 0xa0, 0xb0, 0xc0 |
| 848 | drawbitmap = &m_temp_bitmap_sprites2[0]; |
| 849 | |
| 850 | |
| 838 | 851 | int sizey = used_vCellCount * 16 * vZoom; |
| 839 | 852 | |
| 840 | 853 | vPosition *= 0x40; |
| r21333 | r21334 | |
| 925 | 938 | |
| 926 | 939 | } |
| 927 | 940 | |
| 928 | | //if ((hOrigin & 3) != 1) |
| 929 | | // return; |
| 930 | 941 | |
| 931 | 942 | for (int h = 0; h < used_hCellCount; h++) |
| 932 | 943 | { |
| r21333 | r21334 | |
| 982 | 993 | |
| 983 | 994 | |
| 984 | 995 | // these should be 'cell numbers' (tile numbers) which look up RLE data? |
| 985 | | UINT32 spriteNumber = (m_expanded_10bit_gfx[ (b3romoffset << 3) + (lookupnum<<1) +0 ] << 10) | (m_expanded_10bit_gfx[ (b3romoffset << 3) + (lookupnum<<1) + 1 ]); |
| 996 | UINT32 spriteNumber = (m_expanded_10bit_gfx[ (b3romoffset) + (lookupnum<<1) +0 ] << 10) | (m_expanded_10bit_gfx[ (b3romoffset) + (lookupnum<<1) + 1 ]); |
| 986 | 997 | UINT16 tempshape[16*16]; |
| 987 | 998 | |
| 988 | 999 | // skip the decoding if it's the same tile as last time! |
| r21333 | r21334 | |
| 996 | 1007 | while (data_written<256) |
| 997 | 1008 | { |
| 998 | 1009 | |
| 999 | | UINT16 compdata = m_expanded_10bit_gfx[ (b3romoffset << 3) + spriteNumber + i]; |
| 1010 | UINT16 compdata = m_expanded_10bit_gfx[ (b3romoffset) + spriteNumber + i]; |
| 1000 | 1011 | |
| 1001 | 1012 | if (((compdata & 0x300) == 0x000) || ((compdata & 0x300) == 0x100)) |
| 1002 | 1013 | { |
| r21333 | r21334 | |
| 1188 | 1199 | // The lower word always seems to be 0x0001 and the upper byte always 0xac. |
| 1189 | 1200 | m_blitterSerialCount = 0; |
| 1190 | 1201 | |
| 1202 | m_blitterAddr = data & 0x00000fff; |
| 1203 | |
| 1204 | // maybe it's actually treated like RAM, and blittermode determines the nature of the write (forward inc, backward inc, no inc etc.) |
| 1205 | // the m_blitterAddr when used does increase by 6 each time |
| 1206 | |
| 1207 | // not seen this triggered |
| 1208 | if ((data & 0xff000000) != 0xac000000) |
| 1209 | printf("blitter mode set without upper bits equal 0xac000000\n"); |
| 1210 | |
| 1211 | // nor this |
| 1212 | if (data & 0x0000f000) |
| 1213 | printf("blitter mode with mask 0x0000f000\n"); |
| 1214 | |
| 1215 | |
| 1191 | 1216 | // form 0xacMM-xxx ac = fixed value for this mode? MM = modes above. -xxx = some kind of offset? but it doesn't increment for each blit like the textOffset / paletteOffset stuff, investigate |
| 1192 | 1217 | |
| 1193 | 1218 | } |
| r21333 | r21334 | |
| 1325 | 1350 | { |
| 1326 | 1351 | const rectangle& visarea = machine().primary_screen->visible_area(); |
| 1327 | 1352 | |
| 1353 | // test code |
| 1354 | int i = 0; |
| 1355 | |
| 1328 | 1356 | if(m_blitterClearMode == 0x8c200000) |
| 1329 | 1357 | { |
| 1330 | | copybitmap(m_screen1_bitmap, m_temp_bitmap_sprites, 0, 0, 0, 0, visarea); |
| 1331 | | m_temp_bitmap_sprites.fill(0, visarea); |
| 1358 | copybitmap(m_screen1_bitmap, m_temp_bitmap_sprites[i], 0, 0, 0, 0, visarea); |
| 1359 | m_temp_bitmap_sprites[i].fill(0, visarea); |
| 1332 | 1360 | } |
| 1333 | 1361 | |
| 1334 | 1362 | if(m_blitterClearMode == 0x8c800000) |
| 1335 | 1363 | { |
| 1336 | | copybitmap(m_screen2_bitmap, m_temp_bitmap_sprites2, 0, 0, 0, 0, visarea); |
| 1337 | | m_temp_bitmap_sprites2.fill(0, visarea); |
| 1364 | copybitmap(m_screen2_bitmap, m_temp_bitmap_sprites2[i], 0, 0, 0, 0, visarea); |
| 1365 | m_temp_bitmap_sprites2[i].fill(0, visarea); |
| 1338 | 1366 | } |
| 1339 | 1367 | } |
| 1340 | 1368 | } |
| r21333 | r21334 | |
| 1358 | 1386 | { |
| 1359 | 1387 | printf("sysh1_unk_blit_w unhandled offset %04x %08x %08x\n", offset, data, mem_mask); |
| 1360 | 1388 | } |
| 1389 | break; |
| 1361 | 1390 | |
| 1391 | case 0x01: |
| 1392 | { |
| 1393 | // writes on startup |
| 1394 | // sysh1_unk_blit_w unhandled offset 0001 01010101 ffffffff |
| 1395 | } |
| 1396 | break; |
| 1397 | |
| 1398 | case 0x02: |
| 1399 | { |
| 1400 | |
| 1401 | // writes 3d0dxxxx / 3d0exxxx before a level start.. tilemaps transfer? |
| 1402 | |
| 1403 | //printf("sysh1_unk_blit_w unhandled offset %04x %08x %08x\n", offset, data, mem_mask); |
| 1404 | |
| 1405 | |
| 1406 | } |
| 1407 | break; |
| 1408 | |
| 1362 | 1409 | } |
| 1363 | 1410 | } |
| 1364 | 1411 | |