Previous 199869 Revisions Next

r26300 Wednesday 20th November, 2013 at 05:21:47 UTC by Angelo Salese
V9958: Added preliminary screen modes 10/11/12, used by Puzzle Star/Sexy Boom [Angelo Salese, Wilbert Pol]
[src/emu/video]v9938.c v9938.h
[src/mame/drivers]sangho.c

trunk/src/mame/drivers/sangho.c
r26299r26300
3737Sexy Boom's DSW setting verified via Z80 code by stephh
3838
3939TODO:
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);
4242
4343*/
4444
r26299r26300
523523   m_ram = auto_alloc_array(machine(), UINT8, 0x20000);
524524}
525525
526GAME( 1991, pzlestar,  0,    pzlestar, pzlestar, sangho_state, sangho, ROT270, "Sang Ho Soft", "Puzzle Star (Sang Ho Soft)", GAME_NOT_WORKING )
527GAME( 1992, sexyboom,  0,    sexyboom, sexyboom, sangho_state, sangho, ROT270, "Sang Ho Soft", "Sexy Boom", GAME_IMPERFECT_GRAPHICS | GAME_WRONG_COLORS )
526GAME( 1991, pzlestar,  0,    pzlestar, pzlestar, sangho_state, sangho, ROT270, "Sang Ho Soft", "Puzzle Star (Sang Ho Soft)", GAME_NOT_WORKING | GAME_IMPERFECT_COLORS )
527GAME( 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
r26299r26300
327327   return 0;
328328}
329329
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
351330READ8_MEMBER( v99x8_device::read )
352331{
353332   switch (offset & 3)
r26299r26300
858837         LOG(("v9938: Attempting to write %02xh to V9958 R#%d\n", data, reg));
859838         data = 0;
860839      }
840      else
841      {
842         if(reg == 25)
843            m_v9958_sp_mode = data & 0x18;
844      }
861845      break;
862846
863847   case 44:
r26299r26300
14361420      xx = m_offset_x * 2;
14371421   while (xx--) *ln++ = pen_bg;
14381422
1439   if (m_cont_reg[2] & 0x40)
1423   if ((m_v9958_sp_mode & 0x18) == 0x08) // v9958 screen 12, puzzle star title screen
14401424   {
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   {
14411513      for (x=0;x<32;x++)
14421514      {
14431515         nametbl_addr++;
trunk/src/emu/video/v9938.h
r26299r26300
185185   int m_pal_write_first, m_cmd_write_first;
186186   UINT8 m_pal_write, m_cmd_write;
187187   UINT8 m_pal_reg[32], m_stat_reg[10], m_cont_reg[48], m_read_ahead;
188   UINT8 m_v9958_sp_mode;
188189
189190   // memory
190191   UINT16 m_address_latch;

Previous 199869 Revisions Next


© 1997-2024 The MAME Team