mirror of
https://github.com/holub/mame
synced 2025-07-04 09:28:51 +03:00
Separation of the LDP-1450 laserdisc player to its own device.
This commit is contained in:
parent
267701595b
commit
2fb36796fb
@ -1201,6 +1201,18 @@ if (MACHINES["LDP1000"]~=null) then
|
|||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
---------------------------------------------------
|
||||||
|
--
|
||||||
|
--@src/devices/machine/ldp1000.h,MACHINES["LDP1450"] = true
|
||||||
|
---------------------------------------------------
|
||||||
|
|
||||||
|
if (MACHINES["LDP1450"]~=null) then
|
||||||
|
files {
|
||||||
|
MAME_DIR .. "src/devices/machine/ldp1450.cpp",
|
||||||
|
MAME_DIR .. "src/devices/machine/ldp1450.h",
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
---------------------------------------------------
|
---------------------------------------------------
|
||||||
--
|
--
|
||||||
--@src/devices/machine/ldvp931.h,MACHINES["LDVP931"] = true
|
--@src/devices/machine/ldvp931.h,MACHINES["LDVP931"] = true
|
||||||
|
@ -431,6 +431,7 @@ MACHINES["LDPR8210"] = true
|
|||||||
MACHINES["LDSTUB"] = true
|
MACHINES["LDSTUB"] = true
|
||||||
MACHINES["LDV1000"] = true
|
MACHINES["LDV1000"] = true
|
||||||
MACHINES["LDP1000"] = true
|
MACHINES["LDP1000"] = true
|
||||||
|
MACHINES["LDP1450"] = true
|
||||||
MACHINES["LDVP931"] = true
|
MACHINES["LDVP931"] = true
|
||||||
--MACHINES["LH5810"] = true
|
--MACHINES["LH5810"] = true
|
||||||
MACHINES["LINFLASH"] = true
|
MACHINES["LINFLASH"] = true
|
||||||
|
355
src/devices/machine/ldp1450.cpp
Normal file
355
src/devices/machine/ldp1450.cpp
Normal file
@ -0,0 +1,355 @@
|
|||||||
|
// license:BSD-3-Clause
|
||||||
|
/***************************************************************************
|
||||||
|
|
||||||
|
Sony LDP-1450 laserdisc emulation.
|
||||||
|
|
||||||
|
TODO:
|
||||||
|
- Dump MCU BIOS(more than one?)
|
||||||
|
- Many players support this command set, split out other device stubs (such as LDP-1550P, PAL)
|
||||||
|
- Text overlay (needed for practically everything)
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
#include "emu.h"
|
||||||
|
#include "machine/ldp1450.h"
|
||||||
|
|
||||||
|
#define DUMP_BCD 1
|
||||||
|
#define FIFO_MAX 0x10
|
||||||
|
|
||||||
|
#define LDP_STAT_UNDEF 0x00
|
||||||
|
#define LDP_STAT_COMPLETION 0x01
|
||||||
|
#define LDP_STAT_ERROR 0x02
|
||||||
|
#define LDP_STAT_PGM_END 0x04
|
||||||
|
#define LDP_STAT_NOT_TARGET 0x05
|
||||||
|
#define LDP_STAT_NO_FRAME 0x06
|
||||||
|
#define LDP_STAT_ACK 0x0a
|
||||||
|
#define LDP_STAT_NAK 0x0b
|
||||||
|
|
||||||
|
ROM_START( ldp1450 )
|
||||||
|
ROM_REGION( 0x2000, "ldp1450", 0 )
|
||||||
|
ROM_LOAD( "ldp1450_bios.bin", 0x0000, 0x2000, NO_DUMP )
|
||||||
|
ROM_END
|
||||||
|
|
||||||
|
//**************************************************************************
|
||||||
|
// GLOBAL VARIABLES
|
||||||
|
//**************************************************************************
|
||||||
|
|
||||||
|
// device type definition
|
||||||
|
const device_type SONY_LDP1450 = &device_creator<sony_ldp1450_device>;
|
||||||
|
|
||||||
|
|
||||||
|
//**************************************************************************
|
||||||
|
// LIVE DEVICE
|
||||||
|
//**************************************************************************
|
||||||
|
|
||||||
|
//-------------------------------------------------
|
||||||
|
// ldp1450_device - constructor
|
||||||
|
//-------------------------------------------------
|
||||||
|
|
||||||
|
sony_ldp1450_device::sony_ldp1450_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
|
||||||
|
: laserdisc_device(mconfig, SONY_LDP1450, "Sony LDP-1450", tag, owner, clock, "ldp1450", __FILE__)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-------------------------------------------------
|
||||||
|
// device_validity_check - perform validity checks
|
||||||
|
// on this device
|
||||||
|
//-------------------------------------------------
|
||||||
|
|
||||||
|
void sony_ldp1450_device::device_validity_check(validity_checker &valid) const
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-------------------------------------------------
|
||||||
|
// device_start - device-specific startup
|
||||||
|
//-------------------------------------------------
|
||||||
|
|
||||||
|
void sony_ldp1450_device::device_start()
|
||||||
|
{
|
||||||
|
laserdisc_device::device_start();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-------------------------------------------------
|
||||||
|
// device_reset - device-specific reset
|
||||||
|
//-------------------------------------------------
|
||||||
|
|
||||||
|
void sony_ldp1450_device::device_reset()
|
||||||
|
{
|
||||||
|
laserdisc_device::device_reset();
|
||||||
|
|
||||||
|
for(int i=0;i<0x10;i++)
|
||||||
|
m_internal_bcd[i] = 0;
|
||||||
|
|
||||||
|
m_ld_input_state = LD_INPUT_GET_COMMAND;
|
||||||
|
m_ld_command_current_byte = m_ld_command_total_bytes = 0;
|
||||||
|
m_ld_frame_index = 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------
|
||||||
|
// device_rom_region - return a pointer to our
|
||||||
|
// ROM region definitions
|
||||||
|
//-------------------------------------------------
|
||||||
|
|
||||||
|
const rom_entry *sony_ldp1450_device::device_rom_region() const
|
||||||
|
{
|
||||||
|
return ROM_NAME(ldp1450);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-------------------------------------------------
|
||||||
|
// player_vsync - VSYNC callback, called at the
|
||||||
|
// start of the blanking period
|
||||||
|
//-------------------------------------------------
|
||||||
|
|
||||||
|
void sony_ldp1450_device::player_vsync(const vbi_metadata &vbi, int fieldnum, const attotime &curtime)
|
||||||
|
{
|
||||||
|
//printf("%d vsync\n",fieldnum);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-------------------------------------------------
|
||||||
|
// player_update - update callback, called on
|
||||||
|
// the first visible line of the frame
|
||||||
|
//-------------------------------------------------
|
||||||
|
|
||||||
|
INT32 sony_ldp1450_device::player_update(const vbi_metadata &vbi, int fieldnum, const attotime &curtime)
|
||||||
|
{
|
||||||
|
//printf("%d update\n",fieldnum);
|
||||||
|
|
||||||
|
return fieldnum;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//**************************************************************************
|
||||||
|
// READ/WRITE HANDLERS
|
||||||
|
//**************************************************************************
|
||||||
|
|
||||||
|
void sony_ldp1450_device::set_new_player_state(ldp1450_player_state which)
|
||||||
|
{
|
||||||
|
m_player_state = which;
|
||||||
|
m_index_state = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void sony_ldp1450_device::set_new_player_bcd(UINT8 data)
|
||||||
|
{
|
||||||
|
printf("Frame data BCD %02x\n",data);
|
||||||
|
|
||||||
|
m_internal_bcd[m_index_state] = data;
|
||||||
|
m_index_state ++;
|
||||||
|
if(m_index_state >= FIFO_MAX)
|
||||||
|
throw emu_fatalerror("FIFO MAX reached");
|
||||||
|
|
||||||
|
m_status = LDP_STAT_ACK;
|
||||||
|
}
|
||||||
|
|
||||||
|
UINT32 sony_ldp1450_device::bcd_to_raw()
|
||||||
|
{
|
||||||
|
UINT32 res = 0;
|
||||||
|
for(int i=0;i<6;i++)
|
||||||
|
res |= (m_internal_bcd[i] & 0xf) << i*4;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
void sony_ldp1450_device::exec_enter_cmd()
|
||||||
|
{
|
||||||
|
const UINT32 saved_frame = bcd_to_raw();
|
||||||
|
|
||||||
|
switch(m_player_state)
|
||||||
|
{
|
||||||
|
case player_standby:
|
||||||
|
throw emu_fatalerror("Unimplemented standby state detected");
|
||||||
|
|
||||||
|
case player_search:
|
||||||
|
// TODO: move to timer
|
||||||
|
advance_slider(1);
|
||||||
|
set_slider_speed(saved_frame);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
//not handling all states yet
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
m_player_state = player_standby;
|
||||||
|
}
|
||||||
|
|
||||||
|
void sony_ldp1450_device::command_w(UINT8 data)
|
||||||
|
{
|
||||||
|
printf("CMD %02x\n",data);
|
||||||
|
m_command = data;
|
||||||
|
|
||||||
|
if((m_command & 0xf0) == 0x30 && (m_command & 0xf) < 0x0a)
|
||||||
|
{
|
||||||
|
set_new_player_bcd(data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch(m_command)
|
||||||
|
{
|
||||||
|
|
||||||
|
case 0x00: /* text handling (start gotoxy) */
|
||||||
|
if ( m_ld_input_state == LD_INPUT_TEXT_COMMAND )
|
||||||
|
{
|
||||||
|
m_ld_input_state = LD_INPUT_TEXT_GET_X;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 0x01: /* text handling (end of text)*/
|
||||||
|
if ( m_ld_input_state == LD_INPUT_TEXT_COMMAND )
|
||||||
|
{
|
||||||
|
m_ld_input_state = LD_INPUT_TEXT_GET_STRING;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 0x02: /* text 'set window' command */
|
||||||
|
if ( m_ld_input_state == LD_INPUT_TEXT_COMMAND )
|
||||||
|
{
|
||||||
|
m_ld_input_state = LD_INPUT_TEXT_GET_SET_WINDOW;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 0x1a: /* text sent */
|
||||||
|
break;
|
||||||
|
case 0x24: /* Audio On */
|
||||||
|
m_status = LDP_STAT_ACK;
|
||||||
|
break;
|
||||||
|
case 0x25: /* Audio Off */
|
||||||
|
m_status = LDP_STAT_ACK;
|
||||||
|
break;
|
||||||
|
case 0x26: /* Video off */
|
||||||
|
printf("Video OFF \n");
|
||||||
|
m_status = LDP_STAT_ACK;
|
||||||
|
break;
|
||||||
|
case 0x27: /* Video on */
|
||||||
|
printf("Video ON \n");
|
||||||
|
m_status = LDP_STAT_ACK;
|
||||||
|
break;
|
||||||
|
case 0x28: /* Stop Codes Enable */
|
||||||
|
printf("Stop Code ON \n");
|
||||||
|
break;
|
||||||
|
case 0x29: /* Stop Codes Disable */
|
||||||
|
printf("Stop Code OFF \n");
|
||||||
|
break;
|
||||||
|
case 0x2a: /* Eject */
|
||||||
|
break;
|
||||||
|
case 0x2b: /* Step forward */
|
||||||
|
break;
|
||||||
|
case 0x2c: /* Step reverse */
|
||||||
|
break;
|
||||||
|
//30 to 39 handled separately, as they are the frame commands
|
||||||
|
case 0x3a: /* Play (answer should have delay) */
|
||||||
|
printf("play\n");
|
||||||
|
set_new_player_state(player_play);
|
||||||
|
m_status = LDP_STAT_ACK;
|
||||||
|
break;
|
||||||
|
case 0x3b: /* Play fast */
|
||||||
|
break;
|
||||||
|
case 0x3c: /* Play slow */
|
||||||
|
break;
|
||||||
|
case 0x3d: /* Play step */
|
||||||
|
break;
|
||||||
|
case 0x3e: /* Play scan */
|
||||||
|
break;
|
||||||
|
case 0x3f: /* Stop */
|
||||||
|
printf("stop\n");
|
||||||
|
set_new_player_state(player_stop);
|
||||||
|
m_status = LDP_STAT_ACK;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x40: // enter, process BCD command
|
||||||
|
printf("CMD Enter\n");
|
||||||
|
exec_enter_cmd();
|
||||||
|
m_status = LDP_STAT_ACK;
|
||||||
|
break;
|
||||||
|
case 0x41: /* CE */
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x43: // search
|
||||||
|
printf("Search \n");
|
||||||
|
set_new_player_state(player_search);
|
||||||
|
m_status = LDP_STAT_ACK;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x44: // repeat play
|
||||||
|
printf("CMD Repeat\n");
|
||||||
|
set_new_player_state(player_repeat);
|
||||||
|
m_status = LDP_STAT_ACK;
|
||||||
|
break;
|
||||||
|
|
||||||
|
/*
|
||||||
|
audio channels absolute enable / disable
|
||||||
|
---- --x- select channel
|
||||||
|
---- ---x enable channel (active low)
|
||||||
|
*/
|
||||||
|
case 0x46:
|
||||||
|
case 0x47:
|
||||||
|
case 0x48:
|
||||||
|
case 0x49:
|
||||||
|
printf("Audio channel %x\n",(m_command & 2) >> 1);
|
||||||
|
printf("Audio status %x\n",(m_command & 1) == 0);
|
||||||
|
m_audio_enable[(m_command & 2) >> 1] = (m_command & 1) == 0;
|
||||||
|
m_status = LDP_STAT_ACK;
|
||||||
|
break;
|
||||||
|
case 0x4a: /* Play reverse(answer should have delay) */
|
||||||
|
printf("play reverse\n");
|
||||||
|
break;
|
||||||
|
case 0x4b: /* Play rev fast */
|
||||||
|
break;
|
||||||
|
case 0x4c: /* Play rev slow */
|
||||||
|
break;
|
||||||
|
case 0x4d: /* Play rev step */
|
||||||
|
break;
|
||||||
|
case 0x4e: /* Play rev scan */
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x4f: /* Still (not implemented)*/
|
||||||
|
if (m_player_state == player_stop)
|
||||||
|
{
|
||||||
|
m_status = LDP_STAT_NAK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_status = LDP_STAT_ACK;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 0x55: /* 'frame mode' (unknown function) */
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x56: // Clear All
|
||||||
|
if (m_player_state == player_search)
|
||||||
|
{
|
||||||
|
printf("clear all\n");
|
||||||
|
|
||||||
|
set_new_player_state(player_search_clr);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_status = LDP_STAT_ACK;
|
||||||
|
// reset any pending operation here
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x60: /* Addr Inq (get current frame number) */
|
||||||
|
for (UINT8 & elem : m_internal_bcd)
|
||||||
|
{
|
||||||
|
printf("Return frame %02x\n",elem);
|
||||||
|
m_status = elem;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 0x62: /* Motor on */
|
||||||
|
break;
|
||||||
|
case 0x6e: // CX enable - anything use it?
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x80: /* text start */
|
||||||
|
printf("CMD Start text\n");
|
||||||
|
m_ld_input_state = LD_INPUT_TEXT_COMMAND;
|
||||||
|
break;
|
||||||
|
case 0x81: /* Turn on text */
|
||||||
|
break;
|
||||||
|
case 0x82: /* Turn off text */
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
m_status = LDP_STAT_UNDEF;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
104
src/devices/machine/ldp1450.h
Normal file
104
src/devices/machine/ldp1450.h
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
// license:BSD-3-Clause
|
||||||
|
/***************************************************************************
|
||||||
|
|
||||||
|
Sony LDP-1450 laserdisc emulation.
|
||||||
|
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef __LDP1450DEV_H__
|
||||||
|
#define __LDP1450DEV_H__
|
||||||
|
|
||||||
|
#include "laserdsc.h"
|
||||||
|
|
||||||
|
|
||||||
|
//**************************************************************************
|
||||||
|
// INTERFACE CONFIGURATION MACROS
|
||||||
|
//**************************************************************************
|
||||||
|
|
||||||
|
#define MCFG_LASERDISC_LDP1450_ADD(_tag, clock) \
|
||||||
|
MCFG_DEVICE_ADD(_tag, SONY_LDP1450, clock)
|
||||||
|
|
||||||
|
//**************************************************************************
|
||||||
|
// TYPE DEFINITIONS
|
||||||
|
//**************************************************************************
|
||||||
|
|
||||||
|
// device type definition
|
||||||
|
extern const device_type SONY_LDP1450;
|
||||||
|
|
||||||
|
// ======================> sony_ldp1450_device
|
||||||
|
|
||||||
|
class sony_ldp1450_device : public laserdisc_device
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// construction/destruction
|
||||||
|
sony_ldp1450_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||||
|
|
||||||
|
// I/O operations TODO: both actually protected
|
||||||
|
void command_w(UINT8 data);
|
||||||
|
UINT8 status_r() const { return m_status; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// device-level overrides
|
||||||
|
virtual void device_validity_check(validity_checker &valid) const override;
|
||||||
|
virtual void device_start() override;
|
||||||
|
virtual void device_reset() override;
|
||||||
|
virtual const rom_entry *device_rom_region() const override;
|
||||||
|
|
||||||
|
virtual void player_vsync(const vbi_metadata &vbi, int fieldnum, const attotime &curtime) override;
|
||||||
|
virtual INT32 player_update(const vbi_metadata &vbi, int fieldnum, const attotime &curtime) override;
|
||||||
|
virtual void player_overlay(bitmap_yuy16 &bitmap) override { }
|
||||||
|
|
||||||
|
UINT8 m_ld_frame_index;
|
||||||
|
UINT8 m_ld_frame[5];
|
||||||
|
UINT8 m_ld_command_current_byte;
|
||||||
|
UINT8 m_ld_command_to_send[5];
|
||||||
|
UINT8 m_ld_command_total_bytes;
|
||||||
|
|
||||||
|
enum LD_INPUT_STATE
|
||||||
|
{
|
||||||
|
LD_INPUT_GET_COMMAND = 0,
|
||||||
|
LD_INPUT_TEXT_COMMAND,
|
||||||
|
LD_INPUT_TEXT_GET_X,
|
||||||
|
LD_INPUT_TEXT_GET_Y,
|
||||||
|
LD_INPUT_TEXT_GET_MODE,
|
||||||
|
LD_INPUT_TEXT_GET_STRING,
|
||||||
|
LD_INPUT_TEXT_GET_SET_WINDOW
|
||||||
|
} m_ld_input_state;
|
||||||
|
|
||||||
|
enum ldp1450_player_state {
|
||||||
|
player_standby = 0,
|
||||||
|
player_search,
|
||||||
|
player_search_clr,
|
||||||
|
player_play,
|
||||||
|
player_stop,
|
||||||
|
player_repeat
|
||||||
|
};
|
||||||
|
|
||||||
|
private:
|
||||||
|
UINT8 m_command;
|
||||||
|
UINT8 m_status;
|
||||||
|
ldp1450_player_state m_player_state;
|
||||||
|
bool m_audio_enable[2];
|
||||||
|
void set_new_player_state(ldp1450_player_state which);
|
||||||
|
void set_new_player_bcd(UINT8 data);
|
||||||
|
UINT32 bcd_to_raw();
|
||||||
|
void exec_enter_cmd();
|
||||||
|
UINT8 m_internal_bcd[0x10];
|
||||||
|
UINT8 m_index_state;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//**************************************************************************
|
||||||
|
// GLOBAL VARIABLES
|
||||||
|
//**************************************************************************
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
@ -17,6 +17,5 @@
|
|||||||
//**************************************************************************
|
//**************************************************************************
|
||||||
|
|
||||||
// device type definition
|
// device type definition
|
||||||
const device_type SONY_LDP1450 = &device_creator<sony_ldp1450_device>;
|
|
||||||
const device_type PIONEER_PR7820 = &device_creator<pioneer_pr7820_device>;
|
const device_type PIONEER_PR7820 = &device_creator<pioneer_pr7820_device>;
|
||||||
const device_type PHILLIPS_22VP932 = &device_creator<phillips_22vp932_device>;
|
const device_type PHILLIPS_22VP932 = &device_creator<phillips_22vp932_device>;
|
||||||
|
@ -20,8 +20,6 @@
|
|||||||
// DEVICE CONFIGURATION MACROS
|
// DEVICE CONFIGURATION MACROS
|
||||||
//**************************************************************************
|
//**************************************************************************
|
||||||
|
|
||||||
#define MCFG_LASERDISC_LDP1450_ADD(_tag) \
|
|
||||||
MCFG_DEVICE_ADD(_tag, SONY_LDP1450, 0)
|
|
||||||
#define MCFG_LASERDISC_PR7820_ADD(_tag) \
|
#define MCFG_LASERDISC_PR7820_ADD(_tag) \
|
||||||
MCFG_DEVICE_ADD(_tag, PIONEER_PR7820, 0)
|
MCFG_DEVICE_ADD(_tag, PIONEER_PR7820, 0)
|
||||||
#define MCFG_LASERDISC_22VP932_ADD(_tag) \
|
#define MCFG_LASERDISC_22VP932_ADD(_tag) \
|
||||||
@ -33,7 +31,6 @@
|
|||||||
//**************************************************************************
|
//**************************************************************************
|
||||||
|
|
||||||
// device type definition
|
// device type definition
|
||||||
extern const device_type SONY_LDP1450;
|
|
||||||
extern const device_type PIONEER_PR7820;
|
extern const device_type PIONEER_PR7820;
|
||||||
extern const device_type PHILLIPS_22VP932;
|
extern const device_type PHILLIPS_22VP932;
|
||||||
|
|
||||||
@ -43,28 +40,6 @@ extern const device_type PHILLIPS_22VP932;
|
|||||||
// TYPE DEFINITIONS
|
// TYPE DEFINITIONS
|
||||||
//**************************************************************************
|
//**************************************************************************
|
||||||
|
|
||||||
// ======================> sony_ldp1450_device
|
|
||||||
|
|
||||||
class sony_ldp1450_device : public laserdisc_device
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
// construction/destruction
|
|
||||||
sony_ldp1450_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
|
|
||||||
: laserdisc_device(mconfig, SONY_LDP1450, "Sony LDP-1450", tag, owner, clock, "ldp1450", __FILE__) { }
|
|
||||||
|
|
||||||
// input/output
|
|
||||||
UINT8 data_available_r() { return CLEAR_LINE; }
|
|
||||||
UINT8 data_r() { return 0; }
|
|
||||||
void data_w(UINT8 data) { }
|
|
||||||
|
|
||||||
protected:
|
|
||||||
// subclass overrides
|
|
||||||
virtual void player_vsync(const vbi_metadata &vbi, int fieldnum, const attotime &curtime) override { }
|
|
||||||
virtual INT32 player_update(const vbi_metadata &vbi, int fieldnum, const attotime &curtime) override { return fieldnum; }
|
|
||||||
virtual void player_overlay(bitmap_yuy16 &bitmap) override { }
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// ======================> pioneer_pr7820_device
|
// ======================> pioneer_pr7820_device
|
||||||
|
|
||||||
class pioneer_pr7820_device : public laserdisc_device
|
class pioneer_pr7820_device : public laserdisc_device
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
#include "cpu/m68000/m68000.h"
|
#include "cpu/m68000/m68000.h"
|
||||||
#include "render.h"
|
#include "render.h"
|
||||||
#include "includes/amiga.h"
|
#include "includes/amiga.h"
|
||||||
#include "machine/ldstub.h"
|
#include "machine/ldp1450.h"
|
||||||
#include "machine/nvram.h"
|
#include "machine/nvram.h"
|
||||||
#include "machine/amigafdc.h"
|
#include "machine/amigafdc.h"
|
||||||
|
|
||||||
@ -306,7 +306,7 @@ static MACHINE_CONFIG_START( alg_r1, alg_state )
|
|||||||
/* video hardware */
|
/* video hardware */
|
||||||
MCFG_FRAGMENT_ADD(ntsc_video)
|
MCFG_FRAGMENT_ADD(ntsc_video)
|
||||||
|
|
||||||
MCFG_LASERDISC_LDP1450_ADD("laserdisc")
|
MCFG_LASERDISC_LDP1450_ADD("laserdisc",9600)
|
||||||
MCFG_LASERDISC_SCREEN("screen")
|
MCFG_LASERDISC_SCREEN("screen")
|
||||||
MCFG_LASERDISC_OVERLAY_DRIVER(512*2, 262, amiga_state, screen_update_amiga)
|
MCFG_LASERDISC_OVERLAY_DRIVER(512*2, 262, amiga_state, screen_update_amiga)
|
||||||
MCFG_LASERDISC_OVERLAY_CLIP((129-8)*2, (449+8-1)*2, 44-8, 244+8-1)
|
MCFG_LASERDISC_OVERLAY_CLIP((129-8)*2, (449+8-1)*2, 44-8, 244+8-1)
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
// copyright-holders:Mariusz Wojcieszek, James Wallace
|
// copyright-holders:Mariusz Wojcieszek, James Wallace
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
|
|
||||||
Nova 'LaserMax'/Atari Games Cops
|
Nova Laserdisc Games/Atari Games COPS
|
||||||
(hardware developed by Nova Productions Limited)
|
(hardware developed by Nova Productions Limited)
|
||||||
Preliminary driver by Mariusz Wojcieszek, James Wallace
|
Preliminary driver by Mariusz Wojcieszek, James Wallace
|
||||||
|
|
||||||
@ -10,15 +10,23 @@
|
|||||||
Bad Boys by Inner Circle, so there is musical accompaniment to areas
|
Bad Boys by Inner Circle, so there is musical accompaniment to areas
|
||||||
where the laserdisc audio is muted.
|
where the laserdisc audio is muted.
|
||||||
|
|
||||||
NOTES: To boot up Revelations, turn the refill key (R) and press button A.
|
The different games here have subtly different control PCBs COPS has an Atari
|
||||||
TODO: There are probably more ROMs for Revelations, the disc contains
|
part number (58-12B), while Revelations simply refers to a Lasermax control PCB
|
||||||
full data for a picture based memory game called 'Vision Quest'.
|
(Lasermax being the consumer name for the LDP series)
|
||||||
|
|
||||||
LaserMax memory map needs sorting out, Cops uses a subset of what's
|
NOTES: To boot up Revelations, turn the refill key (R) and press button A
|
||||||
actually available
|
to init NVRAM.
|
||||||
|
|
||||||
|
TODO: There are probably more ROMs for Revelations and related, the disc
|
||||||
|
contains full data for a picture based memory game called 'Vision Quest'.
|
||||||
|
However, the Vision Quest Laserdisc is slightly different, with Revelations
|
||||||
|
specific data seemingly replaced with black level.
|
||||||
|
|
||||||
The UK version COPS appears to want to communicate with the LDP in a
|
The UK version COPS appears to want to communicate with the LDP in a
|
||||||
different way.
|
different way, passing illegal commands, need to verify this is the same
|
||||||
|
player.
|
||||||
|
|
||||||
|
This should be similar hardware for Street Viper if we get a dump.
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
@ -26,13 +34,15 @@
|
|||||||
#include "cpu/m6502/m6502.h"
|
#include "cpu/m6502/m6502.h"
|
||||||
#include "machine/6522via.h"
|
#include "machine/6522via.h"
|
||||||
#include "sound/sn76496.h"
|
#include "sound/sn76496.h"
|
||||||
|
#include "machine/msm6242.h"
|
||||||
|
#include "machine/ldp1450.h"
|
||||||
|
|
||||||
//#include "machine/mos6551.h"
|
#include "machine/mos6551.h"
|
||||||
|
|
||||||
#include "cops.lh"
|
#include "cops.lh"
|
||||||
|
|
||||||
#define LOG_CDROM 0
|
#define LOG_CDROM 1
|
||||||
#define LOG_DACIA 0
|
#define LOG_DACIA 1
|
||||||
|
|
||||||
#define CMP_REGISTER 0
|
#define CMP_REGISTER 0
|
||||||
#define AUX_REGISTER 1
|
#define AUX_REGISTER 1
|
||||||
@ -46,12 +56,14 @@ public:
|
|||||||
: driver_device(mconfig, type, tag),
|
: driver_device(mconfig, type, tag),
|
||||||
m_maincpu(*this, "maincpu"),
|
m_maincpu(*this, "maincpu"),
|
||||||
m_sn(*this, "snsnd"),
|
m_sn(*this, "snsnd"),
|
||||||
|
m_ld(*this, "laserdisc"),
|
||||||
m_irq(0)
|
m_irq(0)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
// devices
|
// devices
|
||||||
required_device<cpu_device> m_maincpu;
|
required_device<cpu_device> m_maincpu;
|
||||||
required_device<sn76489_device> m_sn;
|
required_device<sn76489_device> m_sn;
|
||||||
|
required_device<sony_ldp1450_device> m_ld;
|
||||||
|
|
||||||
// screen updates
|
// screen updates
|
||||||
UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||||
@ -66,8 +78,12 @@ protected:
|
|||||||
public:
|
public:
|
||||||
DECLARE_WRITE8_MEMBER(io1_w);
|
DECLARE_WRITE8_MEMBER(io1_w);
|
||||||
DECLARE_READ8_MEMBER(io1_r);
|
DECLARE_READ8_MEMBER(io1_r);
|
||||||
|
DECLARE_READ8_MEMBER(io1_lm_r);
|
||||||
DECLARE_WRITE8_MEMBER(io2_w);
|
DECLARE_WRITE8_MEMBER(io2_w);
|
||||||
DECLARE_READ8_MEMBER(io2_r);
|
DECLARE_READ8_MEMBER(io2_r);
|
||||||
|
DECLARE_READ8_MEMBER(ldstatus_r);
|
||||||
|
DECLARE_WRITE_LINE_MEMBER(dacia_irq);
|
||||||
|
DECLARE_WRITE_LINE_MEMBER(ld_w);
|
||||||
DECLARE_WRITE_LINE_MEMBER(via1_irq);
|
DECLARE_WRITE_LINE_MEMBER(via1_irq);
|
||||||
DECLARE_WRITE_LINE_MEMBER(via2_irq);
|
DECLARE_WRITE_LINE_MEMBER(via2_irq);
|
||||||
void dacia_receive(UINT8 data);
|
void dacia_receive(UINT8 data);
|
||||||
@ -88,6 +104,7 @@ public:
|
|||||||
UINT8 m_dacia_irq1_reg;
|
UINT8 m_dacia_irq1_reg;
|
||||||
UINT8 m_dacia_rts1;
|
UINT8 m_dacia_rts1;
|
||||||
UINT8 m_dacia_dtr1;
|
UINT8 m_dacia_dtr1;
|
||||||
|
|
||||||
UINT8 m_parity_1;
|
UINT8 m_parity_1;
|
||||||
UINT8 m_parity_mode_1;
|
UINT8 m_parity_mode_1;
|
||||||
UINT8 m_bpc_1;
|
UINT8 m_bpc_1;
|
||||||
@ -99,13 +116,32 @@ public:
|
|||||||
UINT8 m_dacia_cmp1;
|
UINT8 m_dacia_cmp1;
|
||||||
UINT8 m_dacia_cmpval1;
|
UINT8 m_dacia_cmpval1;
|
||||||
|
|
||||||
|
UINT8 m_dacia_irq2_reg;
|
||||||
|
UINT8 m_dacia_rts2;
|
||||||
|
UINT8 m_dacia_dtr2;
|
||||||
|
|
||||||
|
UINT8 m_parity_2;
|
||||||
|
UINT8 m_parity_mode_2;
|
||||||
|
UINT8 m_bpc_2;
|
||||||
|
int m_dacia_ic_div_2;
|
||||||
|
UINT8 m_dacia_echo2;
|
||||||
|
UINT8 m_dacia_stp_2;
|
||||||
|
UINT8 m_dacia_reg2;
|
||||||
|
UINT8 m_dacia_fe2;
|
||||||
|
UINT8 m_dacia_cmp2;
|
||||||
|
UINT8 m_dacia_cmpval2;
|
||||||
|
|
||||||
UINT8 m_dacia_cts;
|
UINT8 m_dacia_cts;
|
||||||
UINT8 m_dacia_dcd;
|
UINT8 m_dacia_dcd;
|
||||||
UINT8 m_dacia_trans;
|
UINT8 m_dacia_trans;
|
||||||
|
UINT8 m_dacia_trans2;
|
||||||
|
|
||||||
UINT8 m_dacia_receiver_data;
|
UINT8 m_dacia_receiver_data;
|
||||||
UINT8 m_dacia_receiver_full;
|
UINT8 m_dacia_receiver_full;
|
||||||
|
|
||||||
|
UINT8 m_dacia_receiver_data2;
|
||||||
|
UINT8 m_dacia_receiver_full2;
|
||||||
|
|
||||||
UINT8 m_cdrom_ctrl;
|
UINT8 m_cdrom_ctrl;
|
||||||
UINT8 m_cdrom_data;
|
UINT8 m_cdrom_data;
|
||||||
|
|
||||||
@ -113,28 +149,17 @@ public:
|
|||||||
UINT8 m_sn_cb1;
|
UINT8 m_sn_cb1;
|
||||||
|
|
||||||
// LDP-1450
|
// LDP-1450
|
||||||
UINT8 m_ld_command_to_send[5];
|
|
||||||
UINT8 m_ld_command_total_bytes;
|
|
||||||
UINT8 m_ld_command_current_byte;
|
|
||||||
UINT8 m_ld_frame[5];
|
|
||||||
UINT8 m_ld_frame_index;
|
|
||||||
emu_timer *m_ld_timer;
|
emu_timer *m_ld_timer;
|
||||||
TIMER_CALLBACK_MEMBER(ld_timer_callback);
|
TIMER_CALLBACK_MEMBER(ld_timer_callback);
|
||||||
enum LD_INPUT_STATE
|
|
||||||
{
|
|
||||||
LD_INPUT_GET_COMMAND = 0,
|
|
||||||
LD_INPUT_TEXT_COMMAND,
|
|
||||||
LD_INPUT_TEXT_GET_X,
|
|
||||||
LD_INPUT_TEXT_GET_Y,
|
|
||||||
LD_INPUT_TEXT_GET_MODE,
|
|
||||||
LD_INPUT_TEXT_GET_STRING,
|
|
||||||
LD_INPUT_TEXT_GET_SET_WINDOW
|
|
||||||
} m_ld_input_state;
|
|
||||||
|
|
||||||
|
UINT8 m_ld_command_to_send[8];
|
||||||
|
UINT8 m_ld_command_current_byte;
|
||||||
|
UINT8 ldcount=0;
|
||||||
|
UINT8 lddata;
|
||||||
UINT8 generate_isr();
|
UINT8 generate_isr();
|
||||||
void laserdisc_w(UINT8 data);
|
UINT8 generate_isr2();
|
||||||
|
// void laserdisc_w(UINT8 data);
|
||||||
void laserdisc_response_w(UINT8 data);
|
void laserdisc_response_w(UINT8 data);
|
||||||
DECLARE_PALETTE_INIT( cops );
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const int timer_divide_select[16] =
|
const int timer_divide_select[16] =
|
||||||
@ -199,9 +224,15 @@ READ8_MEMBER(cops_state::cdrom_data_r)
|
|||||||
*
|
*
|
||||||
*************************************/
|
*************************************/
|
||||||
|
|
||||||
|
READ8_MEMBER(cops_state::ldstatus_r)
|
||||||
|
{
|
||||||
|
return m_ld->status_r();
|
||||||
|
}
|
||||||
|
|
||||||
TIMER_CALLBACK_MEMBER(cops_state::ld_timer_callback)
|
TIMER_CALLBACK_MEMBER(cops_state::ld_timer_callback)
|
||||||
{
|
{
|
||||||
m_dacia_receiver_full = 1;
|
m_dacia_receiver_full = 1;
|
||||||
|
int m_ld_command_total_bytes =8;
|
||||||
|
|
||||||
if ( m_ld_command_current_byte < m_ld_command_total_bytes )
|
if ( m_ld_command_current_byte < m_ld_command_total_bytes )
|
||||||
{
|
{
|
||||||
@ -214,16 +245,22 @@ TIMER_CALLBACK_MEMBER(cops_state::ld_timer_callback)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void cops_state::laserdisc_response_w(UINT8 data)
|
WRITE_LINE_MEMBER(cops_state::ld_w)
|
||||||
{
|
{
|
||||||
if ( m_ld_command_total_bytes >= 5 )
|
lddata <<= 1;
|
||||||
|
|
||||||
|
if ( state ) lddata |= 1;
|
||||||
|
|
||||||
|
if ( ++ldcount >= 8 )
|
||||||
{
|
{
|
||||||
logerror( "LD Overflow!\n" );
|
ldcount = 0;
|
||||||
}
|
lddata = 0;
|
||||||
m_ld_command_to_send[m_ld_command_total_bytes++] = data;
|
printf("LDBYTE %d",lddata);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cops_state::laserdisc_w(UINT8 data)
|
printf("LDBIT %d",state);
|
||||||
|
}
|
||||||
|
/*void cops_state::laserdisc_w(UINT8 data)
|
||||||
{
|
{
|
||||||
switch( m_ld_input_state )
|
switch( m_ld_input_state )
|
||||||
{
|
{
|
||||||
@ -245,111 +282,10 @@ void cops_state::laserdisc_w(UINT8 data)
|
|||||||
m_ld_input_state = LD_INPUT_GET_COMMAND;
|
m_ld_input_state = LD_INPUT_GET_COMMAND;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case LD_INPUT_TEXT_COMMAND:
|
|
||||||
case LD_INPUT_GET_COMMAND:
|
|
||||||
{
|
|
||||||
switch( data )
|
|
||||||
{
|
|
||||||
case 0x00: /* text handling (start gotoxy) */
|
|
||||||
if ( m_ld_input_state == LD_INPUT_TEXT_COMMAND )
|
|
||||||
{
|
|
||||||
m_ld_input_state = LD_INPUT_TEXT_GET_X;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 0x01: /* text handling (end of text)*/
|
|
||||||
if ( m_ld_input_state == LD_INPUT_TEXT_COMMAND )
|
|
||||||
{
|
|
||||||
m_ld_input_state = LD_INPUT_TEXT_GET_STRING;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 0x02: /* text 'set window' command */
|
|
||||||
if ( m_ld_input_state == LD_INPUT_TEXT_COMMAND )
|
|
||||||
{
|
|
||||||
m_ld_input_state = LD_INPUT_TEXT_GET_SET_WINDOW;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 0x1a: /* text sent */
|
|
||||||
break;
|
|
||||||
case 0x24: /* Audio On */
|
|
||||||
laserdisc_response_w(0x0a);
|
|
||||||
break;
|
|
||||||
case 0x26: /* Video off */
|
|
||||||
laserdisc_response_w(0x0a);
|
|
||||||
break;
|
|
||||||
case 0x27: /* Video on */
|
|
||||||
laserdisc_response_w(0x0a);
|
|
||||||
break;
|
|
||||||
case 0x30: /* Digit */
|
|
||||||
case 0x31:
|
|
||||||
case 0x32:
|
|
||||||
case 0x33:
|
|
||||||
case 0x34:
|
|
||||||
case 0x35:
|
|
||||||
case 0x36:
|
|
||||||
case 0x37:
|
|
||||||
case 0x38:
|
|
||||||
case 0x39:
|
|
||||||
if ( m_ld_frame_index >= 5 )
|
|
||||||
{
|
|
||||||
m_ld_frame_index = 0;
|
|
||||||
}
|
|
||||||
m_ld_frame[m_ld_frame_index++] = data;
|
|
||||||
laserdisc_response_w(0x0a);
|
|
||||||
break;
|
|
||||||
case 0x3a: /* Play (answer should have delay) */
|
|
||||||
laserdisc_response_w(0x0a);
|
|
||||||
break;
|
|
||||||
case 0x3f: /* Stop */
|
|
||||||
laserdisc_response_w(0x0a);
|
|
||||||
break;
|
|
||||||
case 0x40: /* Enter */
|
|
||||||
laserdisc_response_w(0x0a);
|
|
||||||
break;
|
|
||||||
case 0x43: /* Search */
|
|
||||||
laserdisc_response_w(0x0a);
|
|
||||||
break;
|
|
||||||
case 0x46: /* Channel 1 on */
|
|
||||||
laserdisc_response_w(0x0a);
|
|
||||||
break;
|
|
||||||
case 0x47: /* Channel 1 off */
|
|
||||||
laserdisc_response_w(0x0a);
|
|
||||||
break;
|
|
||||||
case 0x48: /* Channel 2 on */
|
|
||||||
laserdisc_response_w(0x0a);
|
|
||||||
break;
|
|
||||||
case 0x49: /* Channel 2 off */
|
|
||||||
laserdisc_response_w(0x0a);
|
|
||||||
break;
|
|
||||||
case 0x4f: /* Still */
|
|
||||||
laserdisc_response_w(0x0a);
|
|
||||||
break;
|
|
||||||
case 0x55: /* 'frame mode' (unknown function) */
|
|
||||||
break;
|
|
||||||
case 0x56: /* C. L. (Reset) */
|
|
||||||
m_ld_input_state = LD_INPUT_GET_COMMAND;
|
|
||||||
laserdisc_response_w(0x0a);
|
|
||||||
break;
|
|
||||||
case 0x60: /* Addr Inq (get current frame number) */
|
|
||||||
for (auto & elem : m_ld_frame)
|
|
||||||
{
|
|
||||||
laserdisc_response_w(elem);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 0x80: /* text start */
|
|
||||||
m_ld_input_state = LD_INPUT_TEXT_COMMAND;
|
|
||||||
break;
|
|
||||||
case 0x81: /* Turn on text */
|
|
||||||
break;
|
|
||||||
case 0x82: /* Turn off text */
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
logerror("Laserdisc command %02x\n", data);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
|
|
||||||
/*************************************
|
/*************************************
|
||||||
*
|
*
|
||||||
@ -363,6 +299,12 @@ void cops_state::laserdisc_w(UINT8 data)
|
|||||||
//remove bits
|
//remove bits
|
||||||
isr &= ~m_dacia_irq1_reg;
|
isr &= ~m_dacia_irq1_reg;
|
||||||
m_maincpu->set_input_line(INPUT_LINE_NMI, isr? ASSERT_LINE:CLEAR_LINE);
|
m_maincpu->set_input_line(INPUT_LINE_NMI, isr? ASSERT_LINE:CLEAR_LINE);
|
||||||
|
|
||||||
|
UINT8 isr2 = generate_isr2();
|
||||||
|
//remove bits
|
||||||
|
isr2 &= ~m_dacia_irq2_reg;
|
||||||
|
m_maincpu->set_input_line(INPUT_LINE_NMI, isr2? ASSERT_LINE:CLEAR_LINE);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void cops_state::dacia_receive(UINT8 data)
|
void cops_state::dacia_receive(UINT8 data)
|
||||||
@ -404,6 +346,21 @@ UINT8 cops_state::generate_isr()
|
|||||||
return isr;
|
return isr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UINT8 cops_state::generate_isr2()
|
||||||
|
{
|
||||||
|
UINT8 isr2 =0;
|
||||||
|
|
||||||
|
isr2 |= m_dacia_receiver_full2;
|
||||||
|
isr2 |= (m_dacia_cmp2 << 1);
|
||||||
|
isr2 |= (m_dacia_trans2 <<4);
|
||||||
|
|
||||||
|
if (isr2)
|
||||||
|
{
|
||||||
|
isr2 |= 0x40;
|
||||||
|
}
|
||||||
|
return isr2;
|
||||||
|
}
|
||||||
|
|
||||||
READ8_MEMBER(cops_state::dacia_r)
|
READ8_MEMBER(cops_state::dacia_r)
|
||||||
{
|
{
|
||||||
switch(offset & 0x07)
|
switch(offset & 0x07)
|
||||||
@ -428,10 +385,41 @@ READ8_MEMBER(cops_state::dacia_r)
|
|||||||
}
|
}
|
||||||
|
|
||||||
case 3: /* RDR1: Receive data register */
|
case 3: /* RDR1: Receive data register */
|
||||||
|
{
|
||||||
m_dacia_receiver_full = 0;
|
m_dacia_receiver_full = 0;
|
||||||
m_dacia_fe1=0;
|
m_dacia_fe1=0;
|
||||||
if (LOG_DACIA) logerror("RDR1 %02x\n",m_dacia_receiver_data);
|
|
||||||
return m_dacia_receiver_data;
|
// if (LOG_DACIA) logerror("RDR1 %02x\n",m_dacia_receiver_data);
|
||||||
|
if (LOG_DACIA) logerror("RDR1 %02x\n",m_ld->status_r());
|
||||||
|
return m_ld->status_r();
|
||||||
|
}
|
||||||
|
case 4: /* ISR2: Interrupt Status Register */
|
||||||
|
{
|
||||||
|
UINT8 isr2 = generate_isr2();
|
||||||
|
m_dacia_trans2 =0;
|
||||||
|
m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
|
||||||
|
return isr2;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 5: /* CSR2: Control Status Register */
|
||||||
|
{
|
||||||
|
UINT8 csr2 =0;
|
||||||
|
csr2 |= m_dacia_rts2;
|
||||||
|
csr2 |= (m_dacia_dtr2 << 1);
|
||||||
|
csr2 |= (m_dacia_cts <<4);
|
||||||
|
csr2 |= (m_dacia_fe2 <<7);
|
||||||
|
if (LOG_DACIA) logerror("CSR2 %02x\n",csr2);
|
||||||
|
return csr2;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 7: /* RDR2: Receive data register */
|
||||||
|
m_dacia_receiver_full2 = 0;
|
||||||
|
m_dacia_fe2=0;
|
||||||
|
|
||||||
|
if (LOG_DACIA) logerror("RDR2 %02x\n",m_ld->status_r());
|
||||||
|
return m_ld->status_r();
|
||||||
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if (LOG_DACIA) logerror("%s:dacia_r(%02x)\n", machine().describe_context(), offset);
|
if (LOG_DACIA) logerror("%s:dacia_r(%02x)\n", machine().describe_context(), offset);
|
||||||
return 0;
|
return 0;
|
||||||
@ -485,7 +473,7 @@ WRITE8_MEMBER(cops_state::dacia_w)
|
|||||||
}
|
}
|
||||||
if (LOG_DACIA) logerror("DACIA TIME %02d\n", XTAL_3_6864MHz / m_dacia_ic_div_1);
|
if (LOG_DACIA) logerror("DACIA TIME %02d\n", XTAL_3_6864MHz / m_dacia_ic_div_1);
|
||||||
|
|
||||||
m_ld_timer->adjust(attotime::from_hz(XTAL_3_6864MHz / m_dacia_ic_div_1), 0, attotime::from_hz(XTAL_3_6864MHz / m_dacia_ic_div_1));
|
// m_ld_timer->adjust(attotime::from_hz(XTAL_3_6864MHz / m_dacia_ic_div_1), 0, attotime::from_hz(XTAL_3_6864MHz / m_dacia_ic_div_1));
|
||||||
|
|
||||||
if (LOG_DACIA) logerror("DACIA Ctrl Register: %02x\n", data);
|
if (LOG_DACIA) logerror("DACIA Ctrl Register: %02x\n", data);
|
||||||
|
|
||||||
@ -507,15 +495,88 @@ WRITE8_MEMBER(cops_state::dacia_w)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
case 3: /* Transmit Data Register 1 */
|
case 3: /* Transmit Data Register 1 */
|
||||||
|
{
|
||||||
if (LOG_DACIA) logerror("DACIA Transmit: %02x %c\n", data, (char)data);
|
if (LOG_DACIA) logerror("DACIA Transmit: %02x %c\n", data, (char)data);
|
||||||
laserdisc_w(data);
|
m_ld->command_w(data);
|
||||||
break;
|
|
||||||
default:
|
|
||||||
if (LOG_DACIA) logerror("%s:dacia_w(%02x,%02x)\n", machine().describe_context(), offset, data);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case 4: /* IRQ enable Register 2 */
|
||||||
|
{
|
||||||
|
m_dacia_irq2_reg &= ~0x80;
|
||||||
|
|
||||||
|
if (data & 0x80) //enable bits
|
||||||
|
{
|
||||||
|
m_dacia_irq2_reg |= (data & 0x7f);
|
||||||
|
}
|
||||||
|
else // disable bits
|
||||||
|
{
|
||||||
|
m_dacia_irq2_reg &= ~(data & 0x7f);
|
||||||
|
}
|
||||||
|
if (LOG_DACIA) logerror("DACIA IRQ 2 Register: %02x\n", m_dacia_irq2_reg);
|
||||||
|
update_dacia_irq();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case 5: /* Control / Format Register 2 */
|
||||||
|
{
|
||||||
|
if (data & 0x80) //Format Register
|
||||||
|
{
|
||||||
|
m_dacia_rts2 = (data & 0x01);
|
||||||
|
m_dacia_dtr2 = (data & 0x02 ? 1:0);
|
||||||
|
m_parity_2 = (data & 0x04);
|
||||||
|
m_parity_mode_2 = ((data & 0x18) >> 3);
|
||||||
|
m_bpc_2 = ((data & 0x60) >> 5) +5;
|
||||||
|
if (LOG_DACIA) logerror("DACIA Format Register 2: %02x\n", data);
|
||||||
|
}
|
||||||
|
else // Control register
|
||||||
|
{
|
||||||
|
m_dacia_ic_div_2 = timer_divide_select[data & 0x15];
|
||||||
|
m_dacia_echo2 = (data & 0x10);
|
||||||
|
m_dacia_stp_2 = (data & 0x20 ? 2:1);
|
||||||
|
if (data & 0x40)
|
||||||
|
{
|
||||||
|
m_dacia_reg2 = AUX_REGISTER;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_dacia_reg2 = CMP_REGISTER;
|
||||||
|
}
|
||||||
|
if (LOG_DACIA) logerror("DACIA TIME 2 %02d\n", XTAL_3_6864MHz / m_dacia_ic_div_1);
|
||||||
|
|
||||||
|
m_ld_timer->adjust(attotime::from_hz(XTAL_3_6864MHz / m_dacia_ic_div_2), 0, attotime::from_hz(XTAL_3_6864MHz / m_dacia_ic_div_2));
|
||||||
|
|
||||||
|
if (LOG_DACIA) logerror("DACIA Ctrl Register 2: %02x\n", data);
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 6: /* Compare / Aux Ctrl Register 2 */
|
||||||
|
{
|
||||||
|
if (m_dacia_reg2 == CMP_REGISTER)
|
||||||
|
{
|
||||||
|
m_dacia_cmp2 =1;
|
||||||
|
m_dacia_cmpval2=data;
|
||||||
|
if (LOG_DACIA) logerror("DACIA Compare mode 2: %02x \n", data);
|
||||||
|
// update_dacia_irq();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (LOG_DACIA) logerror("DACIA Aux ctrl 2: %02x \n", data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case 7: /* Transmit Data Register 2 */
|
||||||
|
{
|
||||||
|
if (LOG_DACIA) logerror("DACIA Transmit 2: %02x %c\n", data, (char)data);
|
||||||
|
|
||||||
|
// for (int i=0; i <8; i++)
|
||||||
|
{
|
||||||
|
// m_ld_command_to_send[i] = data & (1<<i);
|
||||||
|
}
|
||||||
|
// m_ld->command_w(data);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
/*************************************
|
/*************************************
|
||||||
*
|
*
|
||||||
* I/O
|
* I/O
|
||||||
@ -538,6 +599,24 @@ READ8_MEMBER(cops_state::io1_r)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
READ8_MEMBER(cops_state::io1_lm_r)
|
||||||
|
{
|
||||||
|
switch( offset & 0x0f )
|
||||||
|
{
|
||||||
|
case 0x07: /* WDI */
|
||||||
|
return 1;
|
||||||
|
case 0x08: /* SW0 */
|
||||||
|
return ioport("SW0")->read();
|
||||||
|
case 0x09: /* SW1 */
|
||||||
|
return ioport("SW1")->read();
|
||||||
|
case 0x0a: /* SW2 */
|
||||||
|
return ioport("SW2")->read();
|
||||||
|
default:
|
||||||
|
logerror("Unknown io1_r, offset = %03x\n", offset);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
WRITE8_MEMBER(cops_state::io1_w)
|
WRITE8_MEMBER(cops_state::io1_w)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@ -653,7 +732,7 @@ WRITE8_MEMBER(cops_state::io2_w)
|
|||||||
*
|
*
|
||||||
* VIA 1 (U18)
|
* VIA 1 (U18)
|
||||||
* PA0-2 Steer
|
* PA0-2 Steer
|
||||||
* PA3 ?
|
* PA3 Shake motor?
|
||||||
* PA4-6 Fade?
|
* PA4-6 Fade?
|
||||||
* PA7 STK (system rom banking)
|
* PA7 STK (system rom banking)
|
||||||
* PB0-7 SN76489 data bus
|
* PB0-7 SN76489 data bus
|
||||||
@ -726,13 +805,21 @@ static ADDRESS_MAP_START( cops_map, AS_PROGRAM, 8, cops_state )
|
|||||||
AM_RANGE(0xb000, 0xb00f) AM_DEVREADWRITE("via6522_1", via6522_device, read, write) /* VIA 1 */
|
AM_RANGE(0xb000, 0xb00f) AM_DEVREADWRITE("via6522_1", via6522_device, read, write) /* VIA 1 */
|
||||||
AM_RANGE(0xb800, 0xb80f) AM_DEVREADWRITE("via6522_2", via6522_device, read, write) /* VIA 2 */
|
AM_RANGE(0xb800, 0xb80f) AM_DEVREADWRITE("via6522_2", via6522_device, read, write) /* VIA 2 */
|
||||||
AM_RANGE(0xc000, 0xcfff) AM_READWRITE(io2_r, io2_w)
|
AM_RANGE(0xc000, 0xcfff) AM_READWRITE(io2_r, io2_w)
|
||||||
// AM_RANGE(0xd000, 0xd003) AM_DEVREADWRITE("acia6551_1", mos6551_device, read, write )
|
|
||||||
// AM_RANGE(0xd004, 0xd007) AM_DEVREADWRITE("acia6551_2", mos6551_device, read, write )
|
|
||||||
AM_RANGE(0xd000, 0xd007) AM_READWRITE(dacia_r, dacia_w)
|
AM_RANGE(0xd000, 0xd007) AM_READWRITE(dacia_r, dacia_w)
|
||||||
AM_RANGE(0xd800, 0xd80f) AM_DEVREADWRITE("via6522_3", via6522_device, read, write) /* VIA 3 */
|
AM_RANGE(0xd800, 0xd80f) AM_DEVREADWRITE("via6522_3", via6522_device, read, write) /* VIA 3 */
|
||||||
AM_RANGE(0xe000, 0xffff) AM_ROMBANK("sysbank1")
|
AM_RANGE(0xe000, 0xffff) AM_ROMBANK("sysbank1")
|
||||||
ADDRESS_MAP_END
|
ADDRESS_MAP_END
|
||||||
|
|
||||||
|
static ADDRESS_MAP_START( revlatns_map, AS_PROGRAM, 8, cops_state )
|
||||||
|
AM_RANGE(0x0000, 0x1fff) AM_RAM
|
||||||
|
AM_RANGE(0x2000, 0x9fff) AM_ROM AM_REGION("program", 0)
|
||||||
|
AM_RANGE(0xa000, 0xafff) AM_READWRITE(io1_lm_r, io1_w)
|
||||||
|
AM_RANGE(0xb000, 0xb00f) AM_DEVREADWRITE("via6522_1", via6522_device, read, write) /* VIA 1 */
|
||||||
|
AM_RANGE(0xc000, 0xc00f) AM_DEVREADWRITE("rtc", msm6242_device, read, write)
|
||||||
|
AM_RANGE(0xd000, 0xd007) AM_READWRITE(dacia_r, dacia_w)
|
||||||
|
AM_RANGE(0xe000, 0xffff) AM_ROMBANK("sysbank1")
|
||||||
|
ADDRESS_MAP_END
|
||||||
|
|
||||||
static INPUT_PORTS_START( cops )
|
static INPUT_PORTS_START( cops )
|
||||||
PORT_START("SW0")
|
PORT_START("SW0")
|
||||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Switch A") PORT_CODE(KEYCODE_A) PORT_IMPULSE(1)
|
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Switch A") PORT_CODE(KEYCODE_A) PORT_IMPULSE(1)
|
||||||
@ -795,7 +882,6 @@ INPUT_PORTS_END
|
|||||||
void cops_state::machine_start()
|
void cops_state::machine_start()
|
||||||
{
|
{
|
||||||
m_ld_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(cops_state::ld_timer_callback),this));
|
m_ld_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(cops_state::ld_timer_callback),this));
|
||||||
m_dacia_ic_div_1 = timer_divide_select[0];
|
|
||||||
|
|
||||||
m_ld_timer->adjust(attotime::from_hz(167*5), 0, attotime::from_hz(167*5));
|
m_ld_timer->adjust(attotime::from_hz(167*5), 0, attotime::from_hz(167*5));
|
||||||
}
|
}
|
||||||
@ -814,16 +900,9 @@ void cops_state::machine_reset()
|
|||||||
m_dacia_dtr1 = 1;
|
m_dacia_dtr1 = 1;
|
||||||
m_dacia_fe1 = 1;
|
m_dacia_fe1 = 1;
|
||||||
m_dacia_receiver_full = 1;
|
m_dacia_receiver_full = 1;
|
||||||
m_ld_input_state = LD_INPUT_GET_COMMAND;
|
|
||||||
m_ld_command_current_byte = m_ld_command_total_bytes = 0;
|
|
||||||
m_ld_frame_index = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PALETTE_INIT_MEMBER( cops_state,cops )
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
DRIVER_INIT_MEMBER(cops_state,cops)
|
DRIVER_INIT_MEMBER(cops_state,cops)
|
||||||
{
|
{
|
||||||
//The hardware is designed and programmed to use multiple system ROM banks, but for some reason it's hardwired to bank 2.
|
//The hardware is designed and programmed to use multiple system ROM banks, but for some reason it's hardwired to bank 2.
|
||||||
@ -840,16 +919,8 @@ static MACHINE_CONFIG_START( cops, cops_state )
|
|||||||
MCFG_CPU_PROGRAM_MAP(cops_map)
|
MCFG_CPU_PROGRAM_MAP(cops_map)
|
||||||
|
|
||||||
/* video hardware */
|
/* video hardware */
|
||||||
MCFG_SCREEN_ADD("screen", RASTER)
|
MCFG_LASERDISC_LDP1450_ADD("laserdisc",9600)
|
||||||
MCFG_SCREEN_REFRESH_RATE(60)
|
MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", "laserdisc")
|
||||||
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
|
|
||||||
MCFG_SCREEN_UPDATE_DRIVER(cops_state, screen_update)
|
|
||||||
MCFG_SCREEN_SIZE(32*8, 32*8)
|
|
||||||
MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
|
|
||||||
MCFG_SCREEN_PALETTE("palette")
|
|
||||||
|
|
||||||
MCFG_PALETTE_ADD("palette", 8)
|
|
||||||
MCFG_PALETTE_INIT_OWNER(cops_state,cops)
|
|
||||||
|
|
||||||
/* via */
|
/* via */
|
||||||
MCFG_DEVICE_ADD("via6522_1", VIA6522, 0)
|
MCFG_DEVICE_ADD("via6522_1", VIA6522, 0)
|
||||||
@ -865,9 +936,7 @@ static MACHINE_CONFIG_START( cops, cops_state )
|
|||||||
MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(cops_state, cdrom_data_w))
|
MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(cops_state, cdrom_data_w))
|
||||||
MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(cops_state, cdrom_ctrl_w))
|
MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(cops_state, cdrom_ctrl_w))
|
||||||
|
|
||||||
/* acia */
|
/* acia (really a 65C52)*/
|
||||||
// MCFG_MOS6551_ADD("acia6551_1", XTAL_1_8432MHz, nullptr)
|
|
||||||
// MCFG_MOS6551_ADD("acia6551_2", XTAL_1_8432MHz, nullptr)
|
|
||||||
|
|
||||||
/* sound hardware */
|
/* sound hardware */
|
||||||
MCFG_SPEAKER_STANDARD_MONO("mono")
|
MCFG_SPEAKER_STANDARD_MONO("mono")
|
||||||
@ -879,6 +948,35 @@ static MACHINE_CONFIG_START( cops, cops_state )
|
|||||||
MACHINE_CONFIG_END
|
MACHINE_CONFIG_END
|
||||||
|
|
||||||
|
|
||||||
|
static MACHINE_CONFIG_START( revlatns, cops_state )
|
||||||
|
|
||||||
|
/* basic machine hardware */
|
||||||
|
MCFG_CPU_ADD("maincpu",M6502,MAIN_CLOCK/2)
|
||||||
|
MCFG_CPU_PROGRAM_MAP(revlatns_map)
|
||||||
|
|
||||||
|
/* video hardware */
|
||||||
|
MCFG_LASERDISC_LDP1450_ADD("laserdisc",9600)
|
||||||
|
MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", "laserdisc")
|
||||||
|
|
||||||
|
/* via */
|
||||||
|
MCFG_DEVICE_ADD("via6522_1", VIA6522, 0)
|
||||||
|
MCFG_VIA6522_IRQ_HANDLER(WRITELINE(cops_state, via1_irq))
|
||||||
|
MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(cops_state, via1_b_w))
|
||||||
|
MCFG_VIA6522_CB1_HANDLER(WRITE8(cops_state, via1_cb1_w))
|
||||||
|
|
||||||
|
MCFG_DEVICE_ADD("rtc", MSM6242, XTAL_32_768kHz)
|
||||||
|
|
||||||
|
/* acia (really a 65C52)*/
|
||||||
|
|
||||||
|
/* sound hardware */
|
||||||
|
MCFG_SPEAKER_STANDARD_MONO("mono")
|
||||||
|
|
||||||
|
/* TODO: Verify clock */
|
||||||
|
MCFG_SOUND_ADD("snsnd", SN76489, MAIN_CLOCK/2)
|
||||||
|
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
|
||||||
|
|
||||||
|
MACHINE_CONFIG_END
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
|
|
||||||
Game driver(s)
|
Game driver(s)
|
||||||
@ -910,7 +1008,7 @@ ROM_START( copsuk )
|
|||||||
DISK_IMAGE_READONLY( "copscd", 0, NO_DUMP )
|
DISK_IMAGE_READONLY( "copscd", 0, NO_DUMP )
|
||||||
|
|
||||||
DISK_REGION( "laserdisc" )
|
DISK_REGION( "laserdisc" )
|
||||||
DISK_IMAGE_READONLY( "cops", 0, NO_DUMP )
|
DISK_IMAGE_READONLY( "copsld", 0, NO_DUMP )
|
||||||
ROM_END
|
ROM_END
|
||||||
|
|
||||||
ROM_START( revlatns )
|
ROM_START( revlatns )
|
||||||
@ -927,4 +1025,4 @@ ROM_END
|
|||||||
|
|
||||||
GAMEL( 1994, cops, 0, cops, cops, cops_state, cops, ROT0, "Atari Games", "Cops (USA)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND, layout_cops )
|
GAMEL( 1994, cops, 0, cops, cops, cops_state, cops, ROT0, "Atari Games", "Cops (USA)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND, layout_cops )
|
||||||
GAMEL( 1994, copsuk, cops,cops, cops, cops_state, cops, ROT0, "Nova Productions / Deith Leisure","Cops (UK)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND, layout_cops )
|
GAMEL( 1994, copsuk, cops,cops, cops, cops_state, cops, ROT0, "Nova Productions / Deith Leisure","Cops (UK)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND, layout_cops )
|
||||||
GAMEL( 1994, revlatns, 0, cops, revlatns, cops_state, cops, ROT0, "Nova Productions", "Revelations", MACHINE_NOT_WORKING | MACHINE_NO_SOUND, layout_cops )
|
GAMEL( 1994, revlatns, 0, revlatns, revlatns, cops_state, cops, ROT0, "Nova Productions", "Revelations", MACHINE_NOT_WORKING | MACHINE_NO_SOUND, layout_cops )
|
||||||
|
Loading…
Reference in New Issue
Block a user