diff options
Diffstat (limited to 'src/devices/machine/ldp1000.cpp')
-rw-r--r-- | src/devices/machine/ldp1000.cpp | 85 |
1 files changed, 80 insertions, 5 deletions
diff --git a/src/devices/machine/ldp1000.cpp b/src/devices/machine/ldp1000.cpp index 922f3c2b63e..415a4581097 100644 --- a/src/devices/machine/ldp1000.cpp +++ b/src/devices/machine/ldp1000.cpp @@ -5,14 +5,16 @@ Sony LDP-1000 laserdisc emulation. TODO: - - Dump BIOSes (seven of them according to docs) - - Hookup with Sony SMC-70 / SMC-777 + - Dump BIOSes (seven of them according to docs); + - Serial interface, needs BIOS dump; + - Hookup with Sony SMC-70 / SMC-777; ***************************************************************************/ #include "emu.h" #include "machine/ldp1000.h" +#define DUMP_BCD 1 ROM_START( ldp1000 ) ROM_REGION( 0x2000, "ldp1000", 0 ) @@ -110,11 +112,84 @@ INT32 sony_ldp1000_device::player_update(const vbi_metadata &vbi, int fieldnum, // READ/WRITE HANDLERS //************************************************************************** -READ8_MEMBER( sony_ldp1000_device::read ) +READ8_MEMBER( sony_ldp1000_device::status_r ) { - return 0; + UINT8 res = m_status; + m_status = stat_undef; + return res; } -WRITE8_MEMBER( sony_ldp1000_device::write ) +void sony_ldp1000_device::set_new_player_state(ldp1000_player_state which, UINT8 fifo_size) { + m_player_state = which; + m_index_state = 0; + m_index_size = fifo_size; + printf("set new player state\n"); +} + +// TODO: probably don't even need a size ... +void sony_ldp1000_device::set_new_player_bcd(UINT8 data) +{ + m_internal_bcd[m_index_state] = data; + m_index_state ++; + if(m_index_state >= m_index_size) + { + #if DUMP_BCD + for(int i=0;i<m_index_size;i++) + printf("%02x ",m_internal_bcd[i]); + + printf("[size = %02x]\n",m_index_size); + #endif + m_status = stat_ack; + } + else + m_status = stat_ack; +} + + +// TODO: de-instantize this +WRITE8_MEMBER( sony_ldp1000_device::command_w ) +{ + printf("CMD %02x\n",data); + // 0x30 to 0x69 range causes an ACK, anything else is invalid + m_command = data; + + if((m_command & 0xf0) == 0x30) + { + set_new_player_bcd(data); + return; + } + + switch(m_command) + { + case 0x40: // enter bcd command, todo + break; + + case 0x43: // search + set_new_player_state(player_search,5); + m_status = stat_ack; + break; + + /* + audio channels absolute enable / disable + ---- --x- select channel + ---- ---x enable channel (active low) + */ + case 0x46: + case 0x47: + case 0x48: + case 0x49: + m_audio_enable[(m_command & 2) >> 1] = (m_command & 1) == 0; + m_status = stat_ack; + break; + + case 0x56: // Clear All + m_status = stat_ack; + // reset any pending operation here + break; + + default: + m_status = stat_undef; + break; + } } |