summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/machine/akiko.c
diff options
context:
space:
mode:
author Miodrag Milanovic <mmicko@gmail.com>2015-09-13 08:41:44 +0200
committer Miodrag Milanovic <mmicko@gmail.com>2015-09-13 08:41:44 +0200
commitf88cefad27a1737c76e09d99c9fb43e173506081 (patch)
tree2d8167d03579c46e226471747eb4407bd00ed6fa /src/emu/machine/akiko.c
parente92ac9e0fa8e99869894bea00589bbb526be30aa (diff)
Move all devices into separate part of src tree (nw)
Diffstat (limited to 'src/emu/machine/akiko.c')
-rw-r--r--src/emu/machine/akiko.c927
1 files changed, 0 insertions, 927 deletions
diff --git a/src/emu/machine/akiko.c b/src/emu/machine/akiko.c
deleted file mode 100644
index 99acef43cab..00000000000
--- a/src/emu/machine/akiko.c
+++ /dev/null
@@ -1,927 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Mariusz Wojcieszek
-/***************************************************************************
-
- Akiko
-
- ASIC used in the Amiga CD32. Commodore Part number 391563-01.
-
- - CD-ROM controller
- - Builtin 1KB NVRAM
- - Chunky to planar converter
- - 2x CIA chips
-
-***************************************************************************/
-
-#include "akiko.h"
-#include "includes/amiga.h"
-#include "imagedev/chd_cd.h"
-#include "coreutil.h"
-
-
-//**************************************************************************
-// CONSTANTS / MACROS
-//**************************************************************************
-
-#define LOG_AKIKO 0
-#define LOG_AKIKO_CD 0
-
-
-//**************************************************************************
-// DEVICE DEFINITIONS
-//**************************************************************************
-
-const device_type AKIKO = &device_creator<akiko_device>;
-
-//-------------------------------------------------
-// machine_config_additions - device-specific
-// machine configurations
-//-------------------------------------------------
-
-static MACHINE_CONFIG_FRAGMENT( akiko )
-MACHINE_CONFIG_END
-
-machine_config_constructor akiko_device::device_mconfig_additions() const
-{
- return MACHINE_CONFIG_NAME( akiko );
-}
-
-
-//**************************************************************************
-// LIVE DEVICE
-//**************************************************************************
-
-//-------------------------------------------------
-// akiko_device - constructor
-//-------------------------------------------------
-
-akiko_device::akiko_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
- : device_t(mconfig, AKIKO, "CBM AKIKO", tag, owner, clock, "akiko", __FILE__),
- m_c2p_input_index(0),
- m_c2p_output_index(0),
- m_i2c_scl_out(0),
- m_i2c_scl_dir(0),
- m_i2c_sda_out(0),
- m_i2c_sda_dir(0),
- m_cdrom_track_index(0),
- m_cdrom_lba_start(0),
- m_cdrom_lba_end(0),
- m_cdrom_lba_cur(0),
- m_cdrom_readmask(0),
- m_cdrom_readreqmask(0),
- m_cdrom_dmacontrol(0),
- m_cdrom_numtracks(0),
- m_cdrom_speed(0),
- m_cdrom_cmd_start(0),
- m_cdrom_cmd_end(0),
- m_cdrom_cmd_resp(0),
- m_cdda(NULL),
- m_cdrom(NULL),
- m_cdrom_toc(NULL),
- m_dma_timer(NULL),
- m_frame_timer(NULL),
- m_cdrom_is_device(0),
- m_scl_w(*this),
- m_sda_r(*this),
- m_sda_w(*this)
-{
- for (int i = 0; i < 8; i++)
- {
- m_c2p_input_buffer[i] = 0;
- m_c2p_output_buffer[i] = 0;
- }
-
- for (int i = 0; i < 2; i++)
- {
- m_cdrom_status[i] = 0;
- m_cdrom_address[i] = 0;
- }
-}
-
-
-//-------------------------------------------------
-// set_cputag - set cpu tag for cpu we working on
-//-------------------------------------------------
-
-void akiko_device::set_cputag(device_t &device, const char *tag)
-{
- akiko_device &akiko = downcast<akiko_device &>(device);
- akiko.m_cputag = tag;
-}
-
-
-//-------------------------------------------------
-// device_start - device-specific startup
-//-------------------------------------------------
-
-void akiko_device::device_start()
-{
- // resolve callbacks
- m_scl_w.resolve_safe();
- m_sda_r.resolve_safe(1);
- m_sda_w.resolve_safe();
-
- m_c2p_input_index = 0;
- m_c2p_output_index = 0;
-
- m_i2c_scl_out = 0;
- m_i2c_scl_dir = 0;
- m_i2c_sda_out = 0;
- m_i2c_sda_dir = 0;
-
- m_cdrom_status[0] = m_cdrom_status[1] = 0;
- m_cdrom_address[0] = m_cdrom_address[1] = 0;
- m_cdrom_track_index = 0;
- m_cdrom_lba_start = 0;
- m_cdrom_lba_end = 0;
- m_cdrom_lba_cur = 0;
- m_cdrom_readmask = 0;
- m_cdrom_readreqmask = 0;
- m_cdrom_dmacontrol = 0;
- m_cdrom_numtracks = 0;
- m_cdrom_speed = 0;
- m_cdrom_cmd_start = 0;
- m_cdrom_cmd_end = 0;
- m_cdrom_cmd_resp = 0;
-
- device_t *cpu = machine().device(m_cputag);
- m_space = &cpu->memory().space(AS_PROGRAM);
-
- m_cdrom_toc = NULL;
- m_dma_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(akiko_device::dma_proc), this));
- m_frame_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(akiko_device::frame_proc), this));
- m_cdda = machine().device<cdda_device>("cdda");
-}
-
-//-------------------------------------------------
-// device_reset - device-specific reset
-//-------------------------------------------------
-
-void akiko_device::device_reset()
-{
- cdrom_image_device *cddevice = machine().device<cdrom_image_device>("cdrom");
-
- if (cddevice != NULL)
- {
- // MESS case
- m_cdrom = cddevice->get_cdrom_file();
- m_cdrom_is_device = 1;
- }
- else
- {
- // MAME case
- m_cdrom = cdrom_open(get_disk_handle(machine(), ":cdrom"));
- m_cdrom_is_device = 0;
- }
-
- /* create the TOC table */
- if ( m_cdrom != NULL && cdrom_get_last_track(m_cdrom) )
- {
- UINT8 *p;
- int i, addrctrl = cdrom_get_adr_control( m_cdrom, 0 );
- UINT32 discend;
-
- discend = cdrom_get_track_start(m_cdrom,cdrom_get_last_track(m_cdrom)-1);
- discend += cdrom_get_toc(m_cdrom)->tracks[cdrom_get_last_track(m_cdrom)-1].frames;
- discend = lba_to_msf(discend);
-
- m_cdrom_numtracks = cdrom_get_last_track(m_cdrom)+3;
-
- m_cdrom_toc = auto_alloc_array(machine(), UINT8, 13*m_cdrom_numtracks);
- memset( m_cdrom_toc, 0, 13*m_cdrom_numtracks);
-
- p = m_cdrom_toc;
- p[1] = ((addrctrl & 0x0f) << 4) | ((addrctrl & 0xf0) >> 4);
- p[3] = 0xa0; /* first track */
- p[8] = 1;
- p += 13;
- p[1] = 0x01;
- p[3] = 0xa1; /* last track */
- p[8] = cdrom_get_last_track(m_cdrom);
- p += 13;
- p[1] = 0x01;
- p[3] = 0xa2; /* disc end */
- p[8] = (discend >> 16 ) & 0xff;
- p[9] = (discend >> 8 ) & 0xff;
- p[10] = discend & 0xff;
- p += 13;
-
- for( i = 0; i < cdrom_get_last_track(m_cdrom); i++ )
- {
- UINT32 trackpos = cdrom_get_track_start(m_cdrom,i);
-
- trackpos = lba_to_msf(trackpos);
- addrctrl = cdrom_get_adr_control( m_cdrom, i );
-
- p[1] = ((addrctrl & 0x0f) << 4) | ((addrctrl & 0xf0) >> 4);
- p[3] = dec_2_bcd( i+1 );
- p[8] = (trackpos >> 16 ) & 0xff;
- p[9] = (trackpos >> 8 ) & 0xff;
- p[10] = trackpos & 0xff;
-
- p += 13;
- }
- }
-
-}
-
-//-------------------------------------------------
-// device_stop - device-specific stop
-//-------------------------------------------------
-
-void akiko_device::device_stop()
-{
- if (!m_cdrom_is_device)
- {
- if( m_cdrom )
- {
- cdrom_close(m_cdrom);
- m_cdrom = (cdrom_file *)NULL;
- }
- }
-}
-
-void akiko_device::nvram_write(UINT32 data)
-{
- m_i2c_scl_out = BIT(data, 31);
- m_i2c_sda_out = BIT(data, 30);
- m_i2c_scl_dir = BIT(data, 15);
- m_i2c_sda_dir = BIT(data, 14);
-
- m_scl_w(m_i2c_scl_out);
- m_sda_w(m_i2c_sda_out);
-}
-
-UINT32 akiko_device::nvram_read()
-{
- UINT32 v = 0;
-
- if (m_i2c_scl_dir)
- v |= m_i2c_scl_out << 31;
-
- if (m_i2c_sda_dir)
- v |= m_i2c_sda_out << 30;
- else
- v |= m_sda_r() << 30;
-
- v |= m_i2c_scl_dir << 15;
- v |= m_i2c_sda_dir << 14;
-
- return v;
-}
-
-/*************************************
- *
- * Akiko Chunky to Planar converter
- *
- ************************************/
-
-void akiko_device::c2p_write(UINT32 data)
-{
- m_c2p_input_buffer[m_c2p_input_index] = data;
- m_c2p_input_index++;
- m_c2p_input_index &= 7;
- m_c2p_output_index = 0;
-}
-
-UINT32 akiko_device::c2p_read()
-{
- UINT32 val;
-
- if ( m_c2p_output_index == 0 )
- {
- int i;
-
- for ( i = 0; i < 8; i++ )
- m_c2p_output_buffer[i] = 0;
-
- for (i = 0; i < 8 * 32; i++)
- {
- if (m_c2p_input_buffer[7 - (i >> 5)] & (1 << (i & 31)))
- m_c2p_output_buffer[i & 7] |= 1 << (i >> 3);
- }
- }
- m_c2p_input_index = 0;
- val = m_c2p_output_buffer[m_c2p_output_index];
- m_c2p_output_index++;
- m_c2p_output_index &= 7;
- return val;
-}
-
-static const char *const akiko_reg_names[] =
-{
- /*0*/ "ID",
- /*1*/ "CDROM STATUS 1",
- /*2*/ "CDROM_STATUS 2",
- /*3*/ "???",
- /*4*/ "CDROM ADDRESS 1",
- /*5*/ "CDROM ADDRESS 2",
- /*6*/ "CDROM COMMAND 1",
- /*7*/ "CDROM COMMAND 2",
- /*8*/ "CDROM READMASK",
- /*9*/ "CDROM DMACONTROL",
- /*A*/ "???",
- /*B*/ "???",
- /*C*/ "NVRAM",
- /*D*/ "???",
- /*E*/ "C2P"
-};
-
-static const char* get_akiko_reg_name(int reg)
-{
- if (reg < 0xf )
- {
- return akiko_reg_names[reg];
- }
- else
- {
- return "???";
- }
-}
-
-/*************************************
- *
- * Akiko CDROM Controller
- *
- ************************************/
-
-void akiko_device::cdda_stop()
-{
- if (m_cdda != NULL)
- {
- m_cdda->stop_audio();
- m_frame_timer->reset( );
- }
-}
-
-void akiko_device::cdda_play(UINT32 lba, UINT32 num_blocks)
-{
- if (m_cdda != NULL)
- {
- m_cdda->start_audio(lba, num_blocks);
- m_frame_timer->adjust( attotime::from_hz( 75 ) );
- }
-}
-
-void akiko_device::cdda_pause(int pause)
-{
- if (m_cdda != NULL)
- {
- if (m_cdda->audio_active() && m_cdda->audio_paused() != pause )
- {
- m_cdda->pause_audio(pause);
-
- if ( pause )
- {
- m_frame_timer->reset( );
- }
- else
- {
- m_frame_timer->adjust( attotime::from_hz( 75 ) );
- }
- }
- }
-}
-
-UINT8 akiko_device::cdda_getstatus(UINT32 *lba)
-{
- if ( lba ) *lba = 0;
-
- if (m_cdda != NULL)
- {
- if (m_cdda->audio_active())
- {
- if ( lba ) *lba = m_cdda->get_audio_lba();
-
- if (m_cdda->audio_paused())
- {
- return 0x12; /* audio paused */
- }
- else
- {
- return 0x11; /* audio in progress */
- }
- }
- else if (m_cdda->audio_ended())
- {
- return 0x13; /* audio ended */
- }
- }
-
- return 0x15; /* no audio status */
-}
-
-void akiko_device::set_cd_status(UINT32 status)
-{
- amiga_state *amiga = machine().driver_data<amiga_state>();
-
- m_cdrom_status[0] |= status;
-
- if ( m_cdrom_status[0] & m_cdrom_status[1] )
- {
- if (LOG_AKIKO_CD)
- logerror("Akiko CD IRQ\n");
-
- amiga->custom_chip_w(REG_INTREQ, INTENA_SETCLR | INTENA_PORTS);
- }
-}
-
-TIMER_CALLBACK_MEMBER(akiko_device::frame_proc)
-{
- (void)param;
-
- if (m_cdda != NULL)
- {
- UINT8 s = cdda_getstatus(NULL);
-
- if ( s == 0x11 )
- {
- set_cd_status(0x80000000); /* subcode ready */
- }
-
- m_frame_timer->adjust( attotime::from_hz( 75 ) );
- }
-}
-
-static UINT32 lba_from_triplet( UINT8 *triplet )
-{
- UINT32 r;
-
- r = bcd_2_dec(triplet[0]) * (60*75);
- r += bcd_2_dec(triplet[1]) * 75;
- r += bcd_2_dec(triplet[2]);
-
- return r;
-}
-
-TIMER_CALLBACK_MEMBER(akiko_device::dma_proc)
-{
- UINT8 buf[2352];
- int index;
-
- if ( (m_cdrom_dmacontrol & 0x04000000) == 0 )
- return;
-
- if ( m_cdrom_readreqmask == 0 )
- return;
-
- index = (m_cdrom_lba_cur - m_cdrom_lba_start) & 0x0f;
-
- if ( m_cdrom_readreqmask & ( 1 << index ) )
- {
- amiga_state *amiga = machine().driver_data<amiga_state>();
- UINT32 track = cdrom_get_track( m_cdrom, m_cdrom_lba_cur );
- UINT32 datasize = cdrom_get_toc( m_cdrom )->tracks[track].datasize;
- UINT32 subsize = cdrom_get_toc( m_cdrom )->tracks[track].subsize;
- int i;
-
- UINT32 curmsf = lba_to_msf( m_cdrom_lba_cur );
- memset( buf, 0, 16 );
-
- buf[3] = m_cdrom_lba_cur - m_cdrom_lba_start;
- memset( &buf[4], 0xff, 8 );
-
- buf[12] = (curmsf >> 16) & 0xff;
- buf[13] = (curmsf >> 8) & 0xff;
- buf[14] = curmsf & 0xff;
- buf[15] = 0x01; /* mode1 */
-
- datasize = 2048;
- if ( !cdrom_read_data( m_cdrom, m_cdrom_lba_cur, &buf[16], CD_TRACK_MODE1 ) )
- {
- logerror( "AKIKO: Read error trying to read sector %08x!\n", m_cdrom_lba_cur );
- return;
- }
-
- if ( subsize )
- {
- if ( !cdrom_read_subcode( m_cdrom, m_cdrom_lba_cur, &buf[16+datasize] ) )
- {
- logerror( "AKIKO: Read error trying to read subcode for sector %08x!\n", m_cdrom_lba_cur );
- return;
- }
- }
-
- if (LOG_AKIKO_CD) logerror( "DMA: sector %d - address %08x\n", m_cdrom_lba_cur, m_cdrom_address[0] + (index*4096) );
-
- for( i = 0; i < 2352; i += 2 )
- {
- UINT16 data;
-
- data = buf[i];
- data <<= 8;
- data |= buf[i+1];
-
- amiga->chip_ram_w(m_cdrom_address[0] + (index*4096) + i, data );
- }
-
- m_cdrom_readmask |= ( 1 << index );
- m_cdrom_readreqmask &= ~( 1 << index );
- m_cdrom_lba_cur++;
- }
-
- if ( m_cdrom_readreqmask == 0 )
- set_cd_status(0x04000000);
- else
- m_dma_timer->adjust( attotime::from_usec( CD_SECTOR_TIME / m_cdrom_speed ) );
-}
-
-void akiko_device::start_dma()
-{
- if ( m_cdrom_readreqmask == 0 )
- return;
-
- if ( m_cdrom_lba_start > m_cdrom_lba_end )
- return;
-
- if ( m_cdrom_speed == 0 )
- return;
-
- m_cdrom_lba_cur = m_cdrom_lba_start;
-
- m_dma_timer->adjust( attotime::from_usec( CD_SECTOR_TIME / m_cdrom_speed ) );
-}
-
-void akiko_device::setup_response( int len, UINT8 *r1 )
-{
- int resp_addr = m_cdrom_address[1];
- UINT8 resp_csum = 0xff;
- UINT8 resp_buffer[32];
- int i;
-
- memset( resp_buffer, 0, sizeof( resp_buffer ) );
-
- for( i = 0; i < len; i++ )
- {
- resp_buffer[i] = r1[i];
- resp_csum -= resp_buffer[i];
- }
-
- resp_buffer[len++] = resp_csum;
-
- for( i = 0; i < len; i++ )
- {
- m_space->write_byte( resp_addr + ((m_cdrom_cmd_resp + i) & 0xff), resp_buffer[i] );
- }
-
- m_cdrom_cmd_resp = (m_cdrom_cmd_resp+len) & 0xff;
-
- set_cd_status(0x10000000); /* new data available */
-}
-
-TIMER_CALLBACK_MEMBER( akiko_device::cd_delayed_cmd )
-{
- UINT8 resp[32];
- UINT8 cddastatus;
-
- if ( m_cdrom_status[0] & 0x10000000 )
- return;
-
- cddastatus = cdda_getstatus(NULL);
-
- if ( cddastatus == 0x11 || cddastatus == 0x12 )
- return;
-
- memset( resp, 0, sizeof( resp ) );
- resp[0] = param;
-
- param &= 0x0f;
-
- if ( param == 0x05 )
- {
- if (LOG_AKIKO_CD) logerror( "AKIKO: Completing Command %d\n", param );
-
- resp[0] = 0x06;
-
- if ( m_cdrom == NULL || m_cdrom_numtracks == 0 )
- {
- resp[1] = 0x80;
- setup_response( 15, resp );
- }
- else
- {
- resp[1] = 0x00;
- memcpy( &resp[2], &m_cdrom_toc[13*m_cdrom_track_index], 13 );
-
- m_cdrom_track_index = ( m_cdrom_track_index + 1 ) % m_cdrom_numtracks;
-
- setup_response( 15, resp );
- }
- }
-}
-
-void akiko_device::update_cdrom()
-{
- UINT8 resp[32], cmdbuf[32];
-
- if ( m_cdrom_status[0] & 0x10000000 )
- return;
-
- while ( m_cdrom_cmd_start != m_cdrom_cmd_end )
- {
- UINT32 cmd_addr = m_cdrom_address[1] + 0x200 + m_cdrom_cmd_start;
- int cmd = m_space->read_byte( cmd_addr );
-
- memset( resp, 0, sizeof( resp ) );
- resp[0] = cmd;
-
- cmd &= 0x0f;
-
- if (LOG_AKIKO_CD) logerror( "CDROM command: %02X\n", cmd );
-
- if ( cmd == 0x02 ) /* pause audio */
- {
- resp[1] = 0x00;
-
- if ( cdda_getstatus(NULL) == 0x11 )
- resp[1] = 0x08;
-
- cdda_pause(1);
-
- m_cdrom_cmd_start = (m_cdrom_cmd_start+2) & 0xff;
-
- setup_response( 2, resp );
- }
- else if ( cmd == 0x03 ) /* unpause audio (and check audiocd playing status) */
- {
- resp[1] = 0x00;
-
- if ( cdda_getstatus(NULL) == 0x11 )
- resp[1] = 0x08;
-
- cdda_pause(0);
-
- m_cdrom_cmd_start = (m_cdrom_cmd_start+2) & 0xff;
-
- setup_response( 2, resp );
- }
- else if ( cmd == 0x04 ) /* seek/read/play cd multi command */
- {
- int i;
- UINT32 startpos, endpos;
-
- for( i = 0; i < 13; i++ )
- {
- cmdbuf[i] = m_space->read_byte( cmd_addr );
- cmd_addr &= 0xffffff00;
- cmd_addr += ( m_cdrom_cmd_start + i + 1 ) & 0xff;
- }
-
- m_cdrom_cmd_start = (m_cdrom_cmd_start+13) & 0xff;
-
- if ( m_cdrom == NULL || m_cdrom_numtracks == 0 )
- {
- resp[1] = 0x80;
- setup_response( 2, resp );
- }
- else
- {
- startpos = lba_from_triplet( &cmdbuf[1] );
- endpos = lba_from_triplet( &cmdbuf[4] );
-
- cdda_stop();
-
- resp[1] = 0x00;
-
- if ( cmdbuf[7] == 0x80 )
- {
- if (LOG_AKIKO_CD) logerror( "%s:AKIKO CD: Data read - start lba: %08x - end lba: %08x\n", machine().describe_context(), startpos, endpos );
- m_cdrom_speed = (cmdbuf[8] & 0x40) ? 2 : 1;
- m_cdrom_lba_start = startpos;
- m_cdrom_lba_end = endpos;
-
- resp[1] = 0x02;
- }
- else if ( cmdbuf[10] & 0x04 )
- {
- logerror( "AKIKO CD: Audio Play - start lba: %08x - end lba: %08x\n", startpos, endpos );
- cdda_play(startpos, endpos - startpos);
- resp[1] = 0x08;
- }
- else
- {
- if (LOG_AKIKO_CD) logerror( "AKIKO CD: Seek - start lba: %08x - end lba: %08x\n", startpos, endpos );
- m_cdrom_track_index = 0;
-
- for( i = 0; i < cdrom_get_last_track(m_cdrom); i++ )
- {
- if ( startpos <= cdrom_get_track_start( m_cdrom, i ) )
- {
- /* reset to 0 */
- m_cdrom_track_index = i + 2;
- m_cdrom_track_index %= m_cdrom_numtracks;
- break;
- }
- }
- }
-
- setup_response( 2, resp );
- }
- }
- else if ( cmd == 0x05 ) /* read toc */
- {
- m_cdrom_cmd_start = (m_cdrom_cmd_start+3) & 0xff;
-
- machine().scheduler().timer_set( attotime::from_msec(1), timer_expired_delegate(FUNC(akiko_device::cd_delayed_cmd ), this), resp[0]);
-
- break;
- }
- else if ( cmd == 0x06 ) /* read subq */
- {
- UINT32 lba;
-
- resp[1] = 0x00;
-
- (void)cdda_getstatus(&lba);
-
- if ( lba > 0 )
- {
- UINT32 disk_pos;
- UINT32 track_pos;
- UINT32 track;
- int addrctrl;
-
- track = cdrom_get_track(m_cdrom, lba);
- addrctrl = cdrom_get_adr_control(m_cdrom, track);
-
- resp[2] = 0x00;
- resp[3] = ((addrctrl & 0x0f) << 4) | ((addrctrl & 0xf0) >> 4);
- resp[4] = dec_2_bcd(track+1);
- resp[5] = 0; /* index */
-
- disk_pos = lba_to_msf(lba);
- track_pos = lba_to_msf(lba - cdrom_get_track_start(m_cdrom, track));
-
- /* track position */
- resp[6] = (track_pos >> 16) & 0xff;
- resp[7] = (track_pos >> 8) & 0xff;
- resp[8] = track_pos & 0xff;
-
- /* disk position */
- resp[9] = (disk_pos >> 24) & 0xff;
- resp[10] = (disk_pos >> 16) & 0xff;
- resp[11] = (disk_pos >> 8) & 0xff;
- resp[12] = disk_pos & 0xff;
- }
- else
- {
- resp[1] = 0x80;
- }
-
- setup_response( 15, resp );
- }
- else if ( cmd == 0x07 ) /* check door status */
- {
- resp[1] = 0x01;
-
- m_cdrom_cmd_start = (m_cdrom_cmd_start+2) & 0xff;
-
- if ( m_cdrom == NULL || m_cdrom_numtracks == 0 )
- resp[1] = 0x80;
-
- setup_response( 20, resp );
- break;
- }
- else
- {
- break;
- }
- }
-}
-
-READ32_MEMBER( akiko_device::read )
-{
- UINT32 retval;
-
- if ( LOG_AKIKO && offset < (0x30/4) )
- {
- logerror( "Reading AKIKO reg %0x [%s] at PC=%06x\n", offset, get_akiko_reg_name(offset), m_space->device().safe_pc() );
- }
-
- switch( offset )
- {
- case 0x00/4: /* ID */
- if ( m_cdrom != NULL ) m_cdda->set_cdrom(m_cdrom);
- return 0x0000cafe;
-
- case 0x04/4: /* CDROM STATUS 1 */
- return m_cdrom_status[0];
-
- case 0x08/4: /* CDROM STATUS 2 */
- return m_cdrom_status[1];
-
- case 0x10/4: /* CDROM ADDRESS 1 */
- return m_cdrom_address[0];
-
- case 0x14/4: /* CDROM ADDRESS 2 */
- return m_cdrom_address[1];
-
- case 0x18/4: /* CDROM COMMAND 1 */
- update_cdrom();
- retval = m_cdrom_cmd_start;
- retval <<= 8;
- retval |= m_cdrom_cmd_resp;
- retval <<= 8;
- return retval;
-
- case 0x1C/4: /* CDROM COMMAND 2 */
- update_cdrom();
- retval = m_cdrom_cmd_end;
- retval <<= 16;
- return retval;
-
- case 0x20/4: /* CDROM DMA SECTOR READ MASK */
- retval = m_cdrom_readmask << 16;
- return retval;
-
- case 0x24/4: /* CDROM DMA ENABLE? */
- retval = m_cdrom_dmacontrol;
- return retval;
-
- case 0x30/4: /* NVRAM */
- return nvram_read();
-
- case 0x38/4: /* C2P */
- return c2p_read();
-
- default:
- break;
- }
-
- return 0;
-}
-
-WRITE32_MEMBER( akiko_device::write )
-{
- if ( LOG_AKIKO && offset < (0x30/4) )
- {
- logerror( "Writing AKIKO reg %0x [%s] with %08x at PC=%06x\n", offset, get_akiko_reg_name(offset), data, m_space->device().safe_pc() );
- }
-
- switch( offset )
- {
- case 0x04/4: /* CDROM STATUS 1 */
- m_cdrom_status[0] = data;
- break;
-
- case 0x08/4: /* CDROM STATUS 2 */
- m_cdrom_status[1] = data;
- m_cdrom_status[0] &= data;
- break;
-
- case 0x10/4: /* CDROM ADDRESS 1 */
- m_cdrom_address[0] = data;
- break;
-
- case 0x14/4: /* CDROM ADDRESS 2 */
- m_cdrom_address[1] = data;
- break;
-
- case 0x18/4: /* CDROM COMMAND 1 */
- if ( ACCESSING_BITS_16_23 )
- m_cdrom_cmd_start = ( data >> 16 ) & 0xff;
-
- if ( ACCESSING_BITS_8_15 )
- m_cdrom_cmd_resp = ( data >> 8 ) & 0xff;
-
- update_cdrom();
- break;
-
- case 0x1C/4: /* CDROM COMMAND 2 */
- if ( ACCESSING_BITS_16_23 )
- m_cdrom_cmd_end = ( data >> 16 ) & 0xff;
-
- update_cdrom();
- break;
-
- case 0x20/4: /* CDROM DMA SECTOR READ REQUEST WRITE */
- if (LOG_AKIKO_CD) logerror( "Read Req mask W: data %08x - mem mask %08x\n", data, mem_mask );
- if ( ACCESSING_BITS_16_31 )
- {
- m_cdrom_readreqmask = (data >> 16);
- m_cdrom_readmask = 0;
- }
- break;
-
- case 0x24/4: /* CDROM DMA ENABLE? */
- if (LOG_AKIKO_CD) logerror( "DMA enable W: data %08x - mem mask %08x\n", data, mem_mask );
- if ( ( m_cdrom_dmacontrol ^ data ) & 0x04000000 )
- {
- if ( data & 0x04000000 )
- start_dma();
- }
- m_cdrom_dmacontrol = data;
- break;
-
- case 0x30/4:
- nvram_write(data);
- break;
-
- case 0x38/4:
- c2p_write(data);
- break;
-
- default:
- break;
- }
-}