trunk/src/mame/drivers/sangho.c
| r26299 | r26300 | |
| 37 | 37 | Sexy Boom's DSW setting verified via Z80 code by stephh |
| 38 | 38 | |
| 39 | 39 | TODO: |
| 40 | | - both games almost likely uses unemulated V9958 YJK mode(s) |
| 41 | | http://www.msx-plaza.eu/home.php?page=mccm/mccm72/schermen_eng |
| 40 | - sexyboom hangs at snippet 0x2ca0-0x2ca9, patching 0x2ca7 branch makes it to be fully playable; |
| 41 | - v9958 screen modes 10/11/12 aren't 100% perfect (wrong pixels in some places); |
| 42 | 42 | |
| 43 | 43 | */ |
| 44 | 44 | |
| r26299 | r26300 | |
| 523 | 523 | m_ram = auto_alloc_array(machine(), UINT8, 0x20000); |
| 524 | 524 | } |
| 525 | 525 | |
| 526 | | GAME( 1991, pzlestar, 0, pzlestar, pzlestar, sangho_state, sangho, ROT270, "Sang Ho Soft", "Puzzle Star (Sang Ho Soft)", GAME_NOT_WORKING ) |
| 527 | | GAME( 1992, sexyboom, 0, sexyboom, sexyboom, sangho_state, sangho, ROT270, "Sang Ho Soft", "Sexy Boom", GAME_IMPERFECT_GRAPHICS | GAME_WRONG_COLORS ) |
| 526 | GAME( 1991, pzlestar, 0, pzlestar, pzlestar, sangho_state, sangho, ROT270, "Sang Ho Soft", "Puzzle Star (Sang Ho Soft)", GAME_NOT_WORKING | GAME_IMPERFECT_COLORS ) |
| 527 | GAME( 1992, sexyboom, 0, sexyboom, sexyboom, sangho_state, sangho, ROT270, "Sang Ho Soft", "Sexy Boom", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_COLORS ) |
trunk/src/emu/video/v9938.c
| r26299 | r26300 | |
| 327 | 327 | return 0; |
| 328 | 328 | } |
| 329 | 329 | |
| 330 | | /* |
| 331 | | so lookups for screen 12 will look like: |
| 332 | | |
| 333 | | int ind; |
| 334 | | |
| 335 | | ind = (*data & 7) << 11 | (*(data + 1) & 7) << 14 | |
| 336 | | (*(data + 2) & 7) << 5 | (*(data + 3) & 7) << 8; |
| 337 | | |
| 338 | | pixel0 = s_pal_indYJK[ind | (*data >> 3) & 31]; |
| 339 | | pixel1 = s_pal_indYJK[ind | (*(data + 1) >> 3) & 31]; |
| 340 | | pixel2 = s_pal_indYJK[ind | (*(data + 2) >> 3) & 31]; |
| 341 | | pixel3 = s_pal_indYJK[ind | (*(data + 3) >> 3) & 31]; |
| 342 | | |
| 343 | | and for screen 11: |
| 344 | | |
| 345 | | pixel0 = (*data) & 8 ? pal_ind16[(*data) >> 4] : s_pal_indYJK[ind | (*data >> 3) & 30]; |
| 346 | | pixel1 = *(data+1) & 8 ? pal_ind16[*(data+1) >> 4] : s_pal_indYJK[ind | *(data+1) >> 3) & 30]; |
| 347 | | pixel2 = *(data+2) & 8 ? pal_ind16[*(data+2) >> 4] : s_pal_indYJK[ind | *(data+2) >> 3) & 30]; |
| 348 | | pixel3 = *(data+3) & 8 ? pal_ind16[*(data+3) >> 4] : s_pal_indYJK[ind | *(data+3) >> 3) & 30]; |
| 349 | | */ |
| 350 | | |
| 351 | 330 | READ8_MEMBER( v99x8_device::read ) |
| 352 | 331 | { |
| 353 | 332 | switch (offset & 3) |
| r26299 | r26300 | |
| 858 | 837 | LOG(("v9938: Attempting to write %02xh to V9958 R#%d\n", data, reg)); |
| 859 | 838 | data = 0; |
| 860 | 839 | } |
| 840 | else |
| 841 | { |
| 842 | if(reg == 25) |
| 843 | m_v9958_sp_mode = data & 0x18; |
| 844 | } |
| 861 | 845 | break; |
| 862 | 846 | |
| 863 | 847 | case 44: |
| r26299 | r26300 | |
| 1436 | 1420 | xx = m_offset_x * 2; |
| 1437 | 1421 | while (xx--) *ln++ = pen_bg; |
| 1438 | 1422 | |
| 1439 | | if (m_cont_reg[2] & 0x40) |
| 1423 | if ((m_v9958_sp_mode & 0x18) == 0x08) // v9958 screen 12, puzzle star title screen |
| 1440 | 1424 | { |
| 1425 | for (x=0;x<64;x++) |
| 1426 | { |
| 1427 | int colour[4]; |
| 1428 | int ind; |
| 1429 | |
| 1430 | colour[0] = m_vram_space->read_byte(((nametbl_addr&1) << 16) | (nametbl_addr>>1)); |
| 1431 | nametbl_addr++; |
| 1432 | colour[1] = m_vram_space->read_byte(((nametbl_addr&1) << 16) | (nametbl_addr>>1)); |
| 1433 | nametbl_addr++; |
| 1434 | colour[2] = m_vram_space->read_byte(((nametbl_addr&1) << 16) | (nametbl_addr>>1)); |
| 1435 | nametbl_addr++; |
| 1436 | colour[3] = m_vram_space->read_byte(((nametbl_addr&1) << 16) | (nametbl_addr>>1)); |
| 1437 | |
| 1438 | ind = (colour[0] & 7) << 11 | (colour[1] & 7) << 14 | |
| 1439 | (colour[2] & 7) << 5 | (colour[3] & 7) << 8; |
| 1440 | |
| 1441 | *ln++ = s_pal_indYJK[ind | ((colour[0] >> 3) & 31)]; |
| 1442 | if (_Width > 512) |
| 1443 | *ln++ = s_pal_indYJK[ind | ((colour[0] >> 3) & 31)]; |
| 1444 | |
| 1445 | *ln++ = s_pal_indYJK[ind | ((colour[1] >> 3) & 31)]; |
| 1446 | |
| 1447 | if (_Width > 512) |
| 1448 | *ln++ = s_pal_indYJK[ind | ((colour[1] >> 3) & 31)]; |
| 1449 | |
| 1450 | *ln++ = s_pal_indYJK[ind | ((colour[2] >> 3) & 31)]; |
| 1451 | |
| 1452 | if (_Width > 512) |
| 1453 | *ln++ = s_pal_indYJK[ind | ((colour[2] >> 3) & 31)]; |
| 1454 | |
| 1455 | *ln++ = s_pal_indYJK[ind | ((colour[3] >> 3) & 31)]; |
| 1456 | |
| 1457 | if (_Width > 512) |
| 1458 | *ln++ = s_pal_indYJK[ind | ((colour[3] >> 3) & 31)]; |
| 1459 | |
| 1460 | nametbl_addr++; |
| 1461 | } |
| 1462 | } |
| 1463 | else if ((m_v9958_sp_mode & 0x18) == 0x18) // v9958 screen 10/11, puzzle star & sexy boom gameplay |
| 1464 | { |
| 1465 | for (x=0;x<64;x++) |
| 1466 | { |
| 1467 | int colour[4]; |
| 1468 | int ind; |
| 1469 | |
| 1470 | /* |
| 1471 | pixel0 = (*data) & 8 ? pal_ind16[(*data) >> 4] : s_pal_indYJK[ind | (*data >> 3) & 30]; |
| 1472 | pixel1 = *(data+1) & 8 ? pal_ind16[*(data+1) >> 4] : s_pal_indYJK[ind | *(data+1) >> 3) & 30]; |
| 1473 | pixel2 = *(data+2) & 8 ? pal_ind16[*(data+2) >> 4] : s_pal_indYJK[ind | *(data+2) >> 3) & 30]; |
| 1474 | pixel3 = *(data+3) & 8 ? pal_ind16[*(data+3) >> 4] : s_pal_indYJK[ind | *(data+3) >> 3) & 30]; |
| 1475 | |
| 1476 | */ |
| 1477 | |
| 1478 | colour[0] = m_vram_space->read_byte(((nametbl_addr&1) << 16) | (nametbl_addr>>1)); |
| 1479 | nametbl_addr++; |
| 1480 | colour[1] = m_vram_space->read_byte(((nametbl_addr&1) << 16) | (nametbl_addr>>1)); |
| 1481 | nametbl_addr++; |
| 1482 | colour[2] = m_vram_space->read_byte(((nametbl_addr&1) << 16) | (nametbl_addr>>1)); |
| 1483 | nametbl_addr++; |
| 1484 | colour[3] = m_vram_space->read_byte(((nametbl_addr&1) << 16) | (nametbl_addr>>1)); |
| 1485 | |
| 1486 | ind = (colour[0] & 7) << 11 | (colour[1] & 7) << 14 | |
| 1487 | (colour[2] & 7) << 5 | (colour[3] & 7) << 8; |
| 1488 | |
| 1489 | *ln++ = colour[0] & 8 ? m_pal_ind16[colour[0] >> 4] : s_pal_indYJK[ind | ((colour[0] >> 3) & 30)]; |
| 1490 | if (_Width > 512) |
| 1491 | *ln++ = colour[0] & 8 ? m_pal_ind16[colour[0] >> 4] : s_pal_indYJK[ind | ((colour[0] >> 3) & 30)]; |
| 1492 | |
| 1493 | *ln++ = colour[1] & 8 ? m_pal_ind16[colour[1] >> 4] : s_pal_indYJK[ind | ((colour[1] >> 3) & 30)]; |
| 1494 | |
| 1495 | if (_Width > 512) |
| 1496 | *ln++ = colour[1] & 8 ? m_pal_ind16[colour[1] >> 4] : s_pal_indYJK[ind | ((colour[1] >> 3) & 30)]; |
| 1497 | |
| 1498 | *ln++ = colour[2] & 8 ? m_pal_ind16[colour[2] >> 4] : s_pal_indYJK[ind | ((colour[2] >> 3) & 30)]; |
| 1499 | |
| 1500 | if (_Width > 512) |
| 1501 | *ln++ = colour[2] & 8 ? m_pal_ind16[colour[2] >> 4] : s_pal_indYJK[ind | ((colour[2] >> 3) & 30)]; |
| 1502 | |
| 1503 | *ln++ = colour[3] & 8 ? m_pal_ind16[colour[3] >> 4] : s_pal_indYJK[ind | ((colour[3] >> 3) & 30)]; |
| 1504 | |
| 1505 | if (_Width > 512) |
| 1506 | *ln++ = colour[3] & 8 ? m_pal_ind16[colour[3] >> 4] : s_pal_indYJK[ind | ((colour[3] >> 3) & 30)]; |
| 1507 | |
| 1508 | nametbl_addr++; |
| 1509 | } |
| 1510 | } |
| 1511 | else if (m_cont_reg[2] & 0x40) |
| 1512 | { |
| 1441 | 1513 | for (x=0;x<32;x++) |
| 1442 | 1514 | { |
| 1443 | 1515 | nametbl_addr++; |