mirror of
https://github.com/holub/mame
synced 2025-04-28 11:11:48 +03:00
- esrip.c: Modernized Entertainment Sciences Real Time Image Processor (ESRIP) core. [MooglyGuy]
This commit is contained in:
parent
091239a79c
commit
97bf108760
File diff suppressed because it is too large
Load Diff
@ -20,6 +20,14 @@
|
|||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
/***************************************************************************
|
||||||
|
INTERFACE CONFIGURATION MACROS
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
#define MCFG_CPU_ESRIP_CONFIG(_config) \
|
||||||
|
esrip_device::static_set_config(*device, _config); \
|
||||||
|
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
REGISTER ENUMERATION
|
REGISTER ENUMERATION
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
@ -77,24 +85,192 @@ enum
|
|||||||
ESRIP_IADDR,
|
ESRIP_IADDR,
|
||||||
};
|
};
|
||||||
|
|
||||||
/***************************************************************************
|
|
||||||
CONFIGURATION STRUCTURE
|
//**************************************************************************
|
||||||
***************************************************************************/
|
// TYPE DEFINITIONS
|
||||||
|
//**************************************************************************
|
||||||
|
|
||||||
|
class esrip_device;
|
||||||
|
|
||||||
|
// ======================> esrip_config
|
||||||
|
|
||||||
struct esrip_config
|
struct esrip_config
|
||||||
{
|
{
|
||||||
read16_device_func fdt_r;
|
read16_device_func fdt_r;
|
||||||
write16_device_func fdt_w;
|
write16_device_func fdt_w;
|
||||||
UINT8 (*status_in)(running_machine &machine);
|
UINT8 (*status_in)(running_machine &machine);
|
||||||
int (*draw)(running_machine &machine, int l, int r, int fig, int attr, int addr, int col, int x_scale, int bank);
|
int (*draw)(running_machine &machine, int l, int r, int fig, int attr, int addr, int col, int x_scale, int bank);
|
||||||
const char* const lbrm_prom;
|
const char* lbrm_prom;
|
||||||
};
|
};
|
||||||
|
|
||||||
/***************************************************************************
|
// device type definition
|
||||||
PUBLIC FUNCTIONS
|
extern const device_type ESRIP;
|
||||||
***************************************************************************/
|
|
||||||
|
|
||||||
DECLARE_LEGACY_CPU_DEVICE(ESRIP, esrip);
|
// ======================> esrip_device
|
||||||
|
|
||||||
extern UINT8 get_rip_status(device_t *cpu);
|
// Used by core CPU interface
|
||||||
|
class esrip_device : public cpu_device,
|
||||||
|
public esrip_config
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// construction/destruction
|
||||||
|
esrip_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||||
|
|
||||||
|
// inline configuration helpers
|
||||||
|
static void static_set_config(device_t &device, const esrip_config &config);
|
||||||
|
|
||||||
|
// public interfaces
|
||||||
|
UINT8 get_rip_status();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// device-level overrides
|
||||||
|
virtual void device_start();
|
||||||
|
virtual void device_reset();
|
||||||
|
virtual void device_stop();
|
||||||
|
|
||||||
|
void make_ops();
|
||||||
|
|
||||||
|
// device_execute_interface overrides
|
||||||
|
virtual UINT32 execute_min_cycles() const;
|
||||||
|
virtual UINT32 execute_max_cycles() const;
|
||||||
|
virtual UINT32 execute_input_lines() const;
|
||||||
|
virtual void execute_run();
|
||||||
|
virtual void execute_set_input(int inputnum, int state);
|
||||||
|
|
||||||
|
// device_memory_interface overrides
|
||||||
|
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const;
|
||||||
|
|
||||||
|
// device_disasm_interface overrides
|
||||||
|
virtual UINT32 disasm_min_opcode_bytes() const;
|
||||||
|
virtual UINT32 disasm_max_opcode_bytes() const;
|
||||||
|
virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options);
|
||||||
|
|
||||||
|
// device_state_interface overrides
|
||||||
|
virtual void state_string_export(const device_state_entry &entry, astring &string);
|
||||||
|
|
||||||
|
// address spaces
|
||||||
|
const address_space_config m_program_config;
|
||||||
|
|
||||||
|
// CPU registers
|
||||||
|
UINT16 m_ram[32];
|
||||||
|
UINT16 m_acc;
|
||||||
|
UINT16 m_d_latch;
|
||||||
|
UINT16 m_i_latch;
|
||||||
|
UINT16 m_result;
|
||||||
|
UINT8 m_new_status;
|
||||||
|
UINT8 m_status;
|
||||||
|
UINT16 m_inst;
|
||||||
|
UINT8 m_immflag;
|
||||||
|
UINT8 m_ct;
|
||||||
|
UINT8 m_t;
|
||||||
|
|
||||||
|
/* Instruction latches - current and previous values */
|
||||||
|
UINT8 m_l1, m_pl1;
|
||||||
|
UINT8 m_l2, m_pl2;
|
||||||
|
UINT8 m_l3, m_pl3;
|
||||||
|
UINT8 m_l4, m_pl4;
|
||||||
|
UINT8 m_l5, m_pl5;
|
||||||
|
UINT8 m_l6, m_pl6;
|
||||||
|
UINT8 m_l7, m_pl7;
|
||||||
|
|
||||||
|
UINT8 m_pc;
|
||||||
|
UINT16 m_rip_pc;
|
||||||
|
UINT8 m_status_out;
|
||||||
|
|
||||||
|
UINT8 m_x_scale;
|
||||||
|
UINT8 m_y_scale;
|
||||||
|
UINT8 m_img_bank;
|
||||||
|
UINT8 m_line_latch;
|
||||||
|
UINT16 m_fig_latch;
|
||||||
|
UINT16 m_attr_latch;
|
||||||
|
UINT16 m_adl_latch;
|
||||||
|
UINT16 m_adr_latch;
|
||||||
|
UINT16 m_iaddr_latch;
|
||||||
|
UINT8 m_c_latch;
|
||||||
|
|
||||||
|
UINT16 m_fdt_cnt;
|
||||||
|
UINT16 m_ipt_cnt;
|
||||||
|
|
||||||
|
UINT8 m_fig;
|
||||||
|
UINT16 m_fig_cycles;
|
||||||
|
|
||||||
|
UINT8 m_optable[65536];
|
||||||
|
|
||||||
|
UINT16 *m_ipt_ram;
|
||||||
|
UINT8 *m_lbrm;
|
||||||
|
|
||||||
|
address_space *m_program;
|
||||||
|
direct_read_data *m_direct;
|
||||||
|
|
||||||
|
int m_icount;
|
||||||
|
|
||||||
|
read16_device_func m_fdt_r;
|
||||||
|
write16_device_func m_fdt_w;
|
||||||
|
UINT8 (*m_status_in)(running_machine &machine);
|
||||||
|
int (*m_draw)(running_machine &machine, int l, int r, int fig, int attr, int addr, int col, int x_scale, int bank);
|
||||||
|
|
||||||
|
typedef void (esrip_device::*ophandler)(UINT16 inst);
|
||||||
|
|
||||||
|
ophandler m_opcode[24];
|
||||||
|
|
||||||
|
static const ophandler s_opcodetable[24];
|
||||||
|
|
||||||
|
private:
|
||||||
|
int get_hblank();
|
||||||
|
int get_lbrm();
|
||||||
|
int check_jmp(UINT8 jmp_ctrl);
|
||||||
|
|
||||||
|
// flags
|
||||||
|
void calc_z_flag(UINT16 res);
|
||||||
|
void calc_c_flag_add(UINT16 a, UINT16 b);
|
||||||
|
void calc_c_flag_sub(UINT16 a, UINT16 b);
|
||||||
|
void calc_n_flag(UINT16 res);
|
||||||
|
void calc_v_flag_add(UINT16 a, UINT16 b, UINT32 r);
|
||||||
|
void calc_v_flag_sub(UINT16 a, UINT16 b, UINT32 r);
|
||||||
|
|
||||||
|
// opcodes
|
||||||
|
UINT16 sor_op(UINT16 r, UINT16 opcode);
|
||||||
|
void sor(UINT16 inst);
|
||||||
|
void sonr(UINT16 inst);
|
||||||
|
|
||||||
|
UINT16 tor_op(UINT16 r, UINT16 s, int opcode);
|
||||||
|
void tonr(UINT16 inst);
|
||||||
|
void tor1(UINT16 inst);
|
||||||
|
void tor2(UINT16 inst);
|
||||||
|
|
||||||
|
void bonr(UINT16 inst);
|
||||||
|
void bor1(UINT16 inst);
|
||||||
|
void bor2(UINT16 inst);
|
||||||
|
|
||||||
|
void rotr1(UINT16 inst);
|
||||||
|
void rotr2(UINT16 inst);
|
||||||
|
void rotnr(UINT16 inst);
|
||||||
|
void rotc(UINT16 inst);
|
||||||
|
void rotm(UINT16 inst);
|
||||||
|
|
||||||
|
void prt(UINT16 inst);
|
||||||
|
void prtnr(UINT16 inst);
|
||||||
|
|
||||||
|
void crcf(UINT16 inst);
|
||||||
|
void crcr(UINT16 inst);
|
||||||
|
|
||||||
|
UINT16 shift_op(UINT16 u, int opcode);
|
||||||
|
void shftr(UINT16 inst);
|
||||||
|
void shftnr(UINT16 inst);
|
||||||
|
|
||||||
|
void svstr(UINT16 inst);
|
||||||
|
|
||||||
|
void rstst(UINT16 inst);
|
||||||
|
void setst(UINT16 inst);
|
||||||
|
|
||||||
|
void test(UINT16 inst);
|
||||||
|
|
||||||
|
void nop(UINT16 inst);
|
||||||
|
|
||||||
|
void am29116_execute(UINT16 inst, int _sre);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
CPU_DISASSEMBLE( esrip );
|
||||||
|
|
||||||
#endif /* _ESRIP_H */
|
#endif /* _ESRIP_H */
|
||||||
|
@ -129,10 +129,6 @@ protected:
|
|||||||
direct_read_data *m_direct;
|
direct_read_data *m_direct;
|
||||||
};
|
};
|
||||||
|
|
||||||
// device type definition
|
|
||||||
extern const device_type ATMEGA88;
|
|
||||||
extern const device_type ATMEGA644;
|
|
||||||
|
|
||||||
// ======================> m6809_device
|
// ======================> m6809_device
|
||||||
|
|
||||||
class m6809_device : public m6809_base_device
|
class m6809_device : public m6809_base_device
|
||||||
|
@ -95,7 +95,7 @@ READ8_MEMBER(esripsys_state::uart_r)
|
|||||||
|
|
||||||
READ8_MEMBER(esripsys_state::g_status_r)
|
READ8_MEMBER(esripsys_state::g_status_r)
|
||||||
{
|
{
|
||||||
int bank4 = BIT(get_rip_status(machine().device("video_cpu")), 2);
|
int bank4 = BIT(m_videocpu->get_rip_status(), 2);
|
||||||
int vblank = machine().primary_screen->vblank();
|
int vblank = machine().primary_screen->vblank();
|
||||||
|
|
||||||
return (!vblank << 7) | (bank4 << 6) | (m_f_status & 0x2f);
|
return (!vblank << 7) | (bank4 << 6) | (m_f_status & 0x2f);
|
||||||
@ -144,7 +144,7 @@ WRITE8_MEMBER(esripsys_state::g_status_w)
|
|||||||
READ8_MEMBER(esripsys_state::f_status_r)
|
READ8_MEMBER(esripsys_state::f_status_r)
|
||||||
{
|
{
|
||||||
int vblank = machine().primary_screen->vblank();
|
int vblank = machine().primary_screen->vblank();
|
||||||
UINT8 rip_status = get_rip_status(machine().device("video_cpu"));
|
UINT8 rip_status = m_videocpu->get_rip_status();
|
||||||
|
|
||||||
rip_status = (rip_status & 0x18) | (BIT(rip_status, 6) << 1) | BIT(rip_status, 7);
|
rip_status = (rip_status & 0x18) | (BIT(rip_status, 6) << 1) | BIT(rip_status, 7);
|
||||||
|
|
||||||
@ -705,7 +705,7 @@ static MACHINE_CONFIG_START( esripsys, esripsys_state )
|
|||||||
|
|
||||||
MCFG_CPU_ADD("video_cpu", ESRIP, XTAL_40MHz / 4)
|
MCFG_CPU_ADD("video_cpu", ESRIP, XTAL_40MHz / 4)
|
||||||
MCFG_CPU_PROGRAM_MAP(video_cpu_map)
|
MCFG_CPU_PROGRAM_MAP(video_cpu_map)
|
||||||
MCFG_CPU_CONFIG(rip_config)
|
MCFG_CPU_ESRIP_CONFIG(rip_config)
|
||||||
|
|
||||||
MCFG_CPU_ADD("sound_cpu", M6809E, XTAL_8MHz)
|
MCFG_CPU_ADD("sound_cpu", M6809E, XTAL_8MHz)
|
||||||
MCFG_CPU_PROGRAM_MAP(sound_cpu_map)
|
MCFG_CPU_PROGRAM_MAP(sound_cpu_map)
|
||||||
|
@ -4,6 +4,13 @@
|
|||||||
|
|
||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _ESRIPSYS_H_
|
||||||
|
#define _ESRIPSYS_H_
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "cpu/esrip/esrip.h"
|
||||||
|
|
||||||
/* TODO */
|
/* TODO */
|
||||||
#define ESRIPSYS_PIXEL_CLOCK (XTAL_25MHz / 2)
|
#define ESRIPSYS_PIXEL_CLOCK (XTAL_25MHz / 2)
|
||||||
#define ESRIPSYS_HTOTAL (512 + 141 + 2)
|
#define ESRIPSYS_HTOTAL (512 + 141 + 2)
|
||||||
@ -28,8 +35,11 @@ class esripsys_state : public driver_device
|
|||||||
public:
|
public:
|
||||||
esripsys_state(const machine_config &mconfig, device_type type, const char *tag)
|
esripsys_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||||
: driver_device(mconfig, type, tag),
|
: driver_device(mconfig, type, tag),
|
||||||
|
m_videocpu(*this, "video_cpu"),
|
||||||
m_pal_ram(*this, "pal_ram") { }
|
m_pal_ram(*this, "pal_ram") { }
|
||||||
|
|
||||||
|
required_device<esrip_device> m_videocpu;
|
||||||
|
|
||||||
UINT8 m_g_iodata;
|
UINT8 m_g_iodata;
|
||||||
UINT8 m_g_ioaddr;
|
UINT8 m_g_ioaddr;
|
||||||
UINT8 m_coin_latch;
|
UINT8 m_coin_latch;
|
||||||
@ -102,3 +112,5 @@ public:
|
|||||||
|
|
||||||
/*----------- defined in video/esripsys.c -----------*/
|
/*----------- defined in video/esripsys.c -----------*/
|
||||||
int esripsys_draw(running_machine &machine, int l, int r, int fig, int attr, int addr, int col, int x_scale, int bank);
|
int esripsys_draw(running_machine &machine, int l, int r, int fig, int attr, int addr, int col, int x_scale, int bank);
|
||||||
|
|
||||||
|
#endif // _ESRIPSYS_H_
|
||||||
|
Loading…
Reference in New Issue
Block a user