diff options
Diffstat (limited to 'src/mame/konami/k573mcal.cpp')
-rw-r--r-- | src/mame/konami/k573mcal.cpp | 90 |
1 files changed, 37 insertions, 53 deletions
diff --git a/src/mame/konami/k573mcal.cpp b/src/mame/konami/k573mcal.cpp index 097e80e66fe..3fa74763fe3 100644 --- a/src/mame/konami/k573mcal.cpp +++ b/src/mame/konami/k573mcal.cpp @@ -24,6 +24,8 @@ #include "machine/timehelp.h" +#include "multibyte.h" + k573mcal_device::k573mcal_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : jvs_device(mconfig, KONAMI_573_MASTER_CALENDAR, tag, owner, clock), m_in1(*this, "IN1"), @@ -85,62 +87,54 @@ int k573mcal_device::handle_message(const uint8_t* send_buffer, uint32_t send_si system_time systime; machine().base_datetime(systime); - uint8_t resp[] = { - 0x01, // status, must be 1 - uint8_t(systime.local_time.year % 100), - uint8_t(systime.local_time.month + 1), - systime.local_time.mday, - systime.local_time.weekday, - systime.local_time.hour, - systime.local_time.minute, - seconds // Can't be the same value twice in a row - }; - + *recv_buffer++ = 0x01; // status, must be 1 + *recv_buffer++ = uint8_t(systime.local_time.year % 100); + *recv_buffer++ = uint8_t(systime.local_time.month + 1); + *recv_buffer++ = systime.local_time.mday; + *recv_buffer++ = systime.local_time.weekday; + *recv_buffer++ = systime.local_time.hour; + *recv_buffer++ = systime.local_time.minute; + *recv_buffer++ = seconds; // Can't be the same value twice in a row seconds = (seconds + 1) % 60; - memcpy(recv_buffer, resp, sizeof(resp)); - recv_buffer += sizeof(resp); return 1; } case 0x71: { - // msg: 71 ff ff 01 + // msg: 71 00 00 80 -> Offset = 0x0000, requested size = 0x80 bytes + // msg: 71 00 20 10 -> Offset = 0x0020, requested size = 0x10 bytes + // "Master Calendar ROM". Contents are specific to the game being initialized. + // Only encountered and tested on Hornet games. - uint8_t resp[] = { - 0x01, // status, must be 1 - uint8_t(m_in1->read() & 0x0f), // Area specification - }; + // msg: 71 ff ff 01 -> Offset = 0xffff, requested size = 0x01 bytes, special request for the area specification flag? Used by Sys573 + *recv_buffer++ = 0x01; // status, must be 1 + *recv_buffer++ = uint8_t(m_in1->read() & 0x0f); // Area specification - memcpy(recv_buffer, resp, sizeof(resp)); - recv_buffer += sizeof(resp); return 4; } case 0x7c: { // msg: 7c 7f 00 04 - const uint16_t val = (send_buffer[1] << 8) | send_buffer[2]; + const uint16_t val = get_u16be(&send_buffer[1]); if (val == 0x7f00) { // Return main ID - uint8_t resp[] = { - 0x01, // status, must be 1 - uint8_t((mainId >> 24) & 0xff), uint8_t((mainId >> 16) & 0xff), uint8_t((mainId >> 8) & 0xff), uint8_t(mainId & 0xff), - }; - - memcpy(recv_buffer, resp, sizeof(resp)); - recv_buffer += sizeof(resp); + *recv_buffer++ = 0x01; // status, must be 1 + put_u32be(recv_buffer, mainId); + recv_buffer += 4; } else if (val == 0x8000) { + using namespace std::literals; + static const std::string_view init_complete = "<INIT COMPLETE!>"sv; + // Return sub ID - uint8_t resp[] = { - 0x01, // status, must be 1 - '<', 'I', 'N', 'I', 'T', ' ', 'C', 'O', 'M', 'P', 'L', 'E', 'T', 'E', '!', '>', - uint8_t((subId >> 24) & 0xff), uint8_t((subId >> 16) & 0xff), uint8_t((subId >> 8) & 0xff), uint8_t(subId & 0xff), - uint8_t((~subId >> 24) & 0xff), uint8_t((~subId >> 16) & 0xff), uint8_t((~subId >> 8) & 0xff), uint8_t(~subId & 0xff), - }; - - memcpy(recv_buffer, resp, sizeof(resp)); - recv_buffer += sizeof(resp); + *recv_buffer++ = 0x01; // status, must be 1 + memcpy(recv_buffer, init_complete.data(), init_complete.size()); + recv_buffer += init_complete.size(); + put_u32be(recv_buffer, subId); + recv_buffer += 4; + put_u32be(recv_buffer, ~subId); + recv_buffer += 4; } return 4; @@ -148,18 +142,13 @@ int k573mcal_device::handle_message(const uint8_t* send_buffer, uint32_t send_si case 0x7d: { // msg: 7d 80 10 08 00 00 00 01 ff ff ff fe - const uint16_t val = (send_buffer[1] << 8) | send_buffer[2]; + const uint16_t val = get_u16be(&send_buffer[1]); if (val == 0x8010) { // Set next sub ID - subId = (send_buffer[4] << 24) | (send_buffer[5] << 16) | (send_buffer[6] << 8) | send_buffer[7]; - - uint8_t resp[] = { - 0x01, // status, must be 1 - }; + subId = get_u32be(&send_buffer[4]); - memcpy(recv_buffer, resp, sizeof(resp)); - recv_buffer += sizeof(resp); + *recv_buffer++ = 0x01; // status, must be 1 } return 12; @@ -173,14 +162,9 @@ int k573mcal_device::handle_message(const uint8_t* send_buffer, uint32_t send_si // 000000000000B5 is ??? // msg: 7e xx - uint8_t resp[] = { - // 0x01 - Breaks loop, sends next byte - // 0x04 - Resends byte - 0x01, - }; - - memcpy(recv_buffer, resp, sizeof(resp)); - recv_buffer += sizeof(resp); + // status: 0x01 - Breaks loop, sends next byte + // 0x04 - Resends byte + *recv_buffer++ = 0x01; return 2; } |