mirror of
https://github.com/holub/mame
synced 2025-04-26 02:07:14 +03:00
(MESS) abc1600: Separated the MAC and Mover to their own devices. (nw)
This commit is contained in:
parent
24dbff2975
commit
135c03552f
3
.gitattributes
vendored
3
.gitattributes
vendored
@ -7076,6 +7076,8 @@ src/mess/machine/a2zipdrive.h svneol=native#text/plain
|
||||
src/mess/machine/a7800.c svneol=native#text/plain
|
||||
src/mess/machine/abc1600_bus.c svneol=native#text/plain
|
||||
src/mess/machine/abc1600_bus.h svneol=native#text/plain
|
||||
src/mess/machine/abc1600mac.c svneol=native#text/plain
|
||||
src/mess/machine/abc1600mac.h svneol=native#text/plain
|
||||
src/mess/machine/abc77.c svneol=native#text/plain
|
||||
src/mess/machine/abc77.h svneol=native#text/plain
|
||||
src/mess/machine/abc800kb.c svneol=native#text/plain
|
||||
@ -8275,6 +8277,7 @@ src/mess/video/911_vdt.c svneol=native#text/plain
|
||||
src/mess/video/911_vdt.h svneol=native#text/plain
|
||||
src/mess/video/a7800.c svneol=native#text/plain
|
||||
src/mess/video/abc1600.c svneol=native#text/plain
|
||||
src/mess/video/abc1600.h svneol=native#text/plain
|
||||
src/mess/video/abc80.c svneol=native#text/plain
|
||||
src/mess/video/abc800.c svneol=native#text/plain
|
||||
src/mess/video/abc802.c svneol=native#text/plain
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -8,6 +8,7 @@
|
||||
#include "machine/8530scc.h"
|
||||
#include "machine/abckb.h"
|
||||
#include "machine/abc1600_bus.h"
|
||||
#include "machine/abc1600mac.h"
|
||||
#include "machine/e0516.h"
|
||||
#include "machine/lux4105.h"
|
||||
#include "machine/nmc9306.h"
|
||||
@ -17,7 +18,7 @@
|
||||
#include "machine/z80dart.h"
|
||||
#include "machine/z80dma.h"
|
||||
#include "machine/z8536.h"
|
||||
#include "video/mc6845.h"
|
||||
#include "video/abc1600.h"
|
||||
|
||||
|
||||
|
||||
@ -36,7 +37,6 @@
|
||||
#define FDC9229BT_TAG "7a"
|
||||
#define E050_C16PC_TAG "13b"
|
||||
#define NMC9306_TAG "14c"
|
||||
#define SY6845E_TAG "sy6845e"
|
||||
#define SCREEN_TAG "screen"
|
||||
#define BUS0I_TAG "bus0i"
|
||||
#define BUS0X_TAG "bus0x"
|
||||
@ -52,6 +52,7 @@
|
||||
//**************************************************************************
|
||||
|
||||
// ======================> abc1600_state
|
||||
|
||||
class abc1600_state : public driver_device
|
||||
{
|
||||
public:
|
||||
@ -67,7 +68,6 @@ public:
|
||||
m_fdc(*this, SAB1797_02P_TAG),
|
||||
m_rtc(*this, E050_C16PC_TAG),
|
||||
m_nvram(*this, NMC9306_TAG),
|
||||
m_crtc(*this, SY6845E_TAG),
|
||||
m_ram(*this, RAM_TAG),
|
||||
m_floppy0(*this, SAB1797_02P_TAG":0"),
|
||||
m_floppy1(*this, SAB1797_02P_TAG":1"),
|
||||
@ -75,14 +75,7 @@ public:
|
||||
m_bus0i(*this, BUS0I_TAG),
|
||||
m_bus0x(*this, BUS0X_TAG),
|
||||
m_bus1(*this, BUS1_TAG),
|
||||
m_bus2(*this, BUS2_TAG),
|
||||
m_rom(*this, MC68008P8_TAG),
|
||||
m_wrmsk_rom(*this, "wrmsk"),
|
||||
m_shinf_rom(*this, "shinf"),
|
||||
m_drmsk_rom(*this, "drmsk"),
|
||||
m_segment_ram(*this, "segment_ram"),
|
||||
m_page_ram(*this, "page_ram"),
|
||||
m_video_ram(*this, "video_ram")
|
||||
m_bus2(*this, BUS2_TAG)
|
||||
{ }
|
||||
|
||||
required_device<m68000_base_device> m_maincpu;
|
||||
@ -95,7 +88,6 @@ public:
|
||||
required_device<fd1797_t> m_fdc;
|
||||
required_device<e0516_device> m_rtc;
|
||||
required_device<nmc9306_device> m_nvram;
|
||||
required_device<mc6845_device> m_crtc;
|
||||
required_device<ram_device> m_ram;
|
||||
required_device<floppy_connector> m_floppy0;
|
||||
required_device<floppy_connector> m_floppy1;
|
||||
@ -104,53 +96,23 @@ public:
|
||||
required_device<abc1600bus_slot_device> m_bus0x;
|
||||
required_device<abc1600bus_slot_device> m_bus1;
|
||||
required_device<abc1600bus_slot_device> m_bus2;
|
||||
required_memory_region m_rom;
|
||||
required_memory_region m_wrmsk_rom;
|
||||
required_memory_region m_shinf_rom;
|
||||
required_memory_region m_drmsk_rom;
|
||||
optional_shared_ptr<UINT8> m_segment_ram;
|
||||
optional_shared_ptr<UINT16> m_page_ram;
|
||||
optional_shared_ptr<UINT16> m_video_ram;
|
||||
|
||||
virtual void machine_start();
|
||||
virtual void machine_reset();
|
||||
|
||||
virtual void video_start();
|
||||
UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||
|
||||
DECLARE_READ8_MEMBER( mac_r );
|
||||
DECLARE_WRITE8_MEMBER( mac_w );
|
||||
DECLARE_READ8_MEMBER( cause_r );
|
||||
DECLARE_WRITE8_MEMBER( task_w );
|
||||
DECLARE_READ8_MEMBER( segment_r );
|
||||
DECLARE_WRITE8_MEMBER( segment_w );
|
||||
DECLARE_READ8_MEMBER( page_r );
|
||||
DECLARE_WRITE8_MEMBER( page_w );
|
||||
DECLARE_READ8_MEMBER( bus_r );
|
||||
DECLARE_WRITE8_MEMBER( bus_w );
|
||||
DECLARE_READ8_MEMBER( dart_r );
|
||||
DECLARE_WRITE8_MEMBER( dart_w );
|
||||
DECLARE_READ8_MEMBER( scc_r );
|
||||
DECLARE_WRITE8_MEMBER( scc_w );
|
||||
DECLARE_READ8_MEMBER( cio_r );
|
||||
DECLARE_WRITE8_MEMBER( cio_w );
|
||||
DECLARE_WRITE8_MEMBER( fw0_w );
|
||||
DECLARE_WRITE8_MEMBER( fw1_w );
|
||||
DECLARE_WRITE8_MEMBER( spec_contr_reg_w );
|
||||
|
||||
DECLARE_WRITE8_MEMBER( dmamap_w );
|
||||
DECLARE_WRITE_LINE_MEMBER( dbrq_w );
|
||||
DECLARE_READ8_MEMBER( dma0_mreq_r );
|
||||
DECLARE_WRITE8_MEMBER( dma0_mreq_w );
|
||||
DECLARE_READ8_MEMBER( dma0_iorq_r );
|
||||
DECLARE_WRITE8_MEMBER( dma0_iorq_w );
|
||||
DECLARE_READ8_MEMBER( dma1_mreq_r );
|
||||
DECLARE_WRITE8_MEMBER( dma1_mreq_w );
|
||||
DECLARE_READ8_MEMBER( dma1_iorq_r );
|
||||
DECLARE_WRITE8_MEMBER( dma1_iorq_w );
|
||||
DECLARE_READ8_MEMBER( dma2_mreq_r );
|
||||
DECLARE_WRITE8_MEMBER( dma2_mreq_w );
|
||||
DECLARE_READ8_MEMBER( dma2_iorq_r );
|
||||
DECLARE_WRITE8_MEMBER( dma2_iorq_w );
|
||||
|
||||
DECLARE_READ8_MEMBER( video_ram_r );
|
||||
DECLARE_WRITE8_MEMBER( video_ram_w );
|
||||
DECLARE_READ8_MEMBER( iord0_r );
|
||||
DECLARE_WRITE8_MEMBER( iowr0_w );
|
||||
DECLARE_WRITE8_MEMBER( iowr1_w );
|
||||
DECLARE_WRITE8_MEMBER( iowr2_w );
|
||||
|
||||
DECLARE_READ8_MEMBER( cio_pa_r );
|
||||
DECLARE_READ8_MEMBER( cio_pb_r );
|
||||
@ -165,62 +127,20 @@ public:
|
||||
void fdc_intrq_w(bool state);
|
||||
void fdc_drq_w(bool state);
|
||||
|
||||
int get_current_task(offs_t offset);
|
||||
offs_t get_segment_address(offs_t offset);
|
||||
offs_t get_page_address(offs_t offset, UINT8 segd);
|
||||
offs_t translate_address(offs_t offset, int *nonx, int *wp);
|
||||
UINT8 read_ram(offs_t offset);
|
||||
void write_ram(offs_t offset, UINT8 data);
|
||||
UINT8 read_io(offs_t offset);
|
||||
void write_io(offs_t offset, UINT8 data);
|
||||
UINT8 read_internal_io(offs_t offset);
|
||||
void write_internal_io(offs_t offset, UINT8 data);
|
||||
UINT8 read_external_io(offs_t offset);
|
||||
void write_external_io(offs_t offset, UINT8 data);
|
||||
UINT8 read_user_memory(offs_t offset);
|
||||
void write_user_memory(offs_t offset, UINT8 data);
|
||||
int get_fc();
|
||||
UINT8 read_supervisor_memory(offs_t offset);
|
||||
void write_supervisor_memory(offs_t offset, UINT8 data);
|
||||
|
||||
inline void update_drdy0();
|
||||
inline void update_drdy1();
|
||||
inline void update_drdy2();
|
||||
inline offs_t get_dma_address(int index, UINT16 offset);
|
||||
inline UINT8 dma_mreq_r(int index, UINT16 offset);
|
||||
inline void dma_mreq_w(int index, UINT16 offset, UINT8 data);
|
||||
inline UINT8 dma_iorq_r(int index, UINT16 offset);
|
||||
inline void dma_iorq_w(int index, UINT16 offset, UINT8 data);
|
||||
|
||||
inline UINT16 get_drmsk();
|
||||
inline void get_shinf();
|
||||
inline UINT16 get_wrmsk();
|
||||
inline UINT16 barrel_shift(UINT16 gmdr);
|
||||
inline UINT16 word_mixer(UINT16 rot);
|
||||
inline void clock_mfa_x();
|
||||
inline void clock_mfa_y();
|
||||
inline void clock_mta_x();
|
||||
inline void clock_mta_y();
|
||||
inline void load_mfa_x();
|
||||
inline void load_mta_x();
|
||||
inline void compare_mta_x();
|
||||
inline void compare_mta_y();
|
||||
inline void load_xy_reg();
|
||||
void mover();
|
||||
|
||||
inline UINT16 read_videoram(UINT32 offset);
|
||||
inline void write_videoram(UINT32 offset, UINT16 data, UINT16 mask);
|
||||
inline UINT16 get_crtca(UINT16 ma, UINT8 ra, UINT8 column);
|
||||
void crtc_update_row(device_t *device, bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT16 ma, UINT8 ra, UINT16 y, UINT8 x_count, INT8 cursor_x, void *param);
|
||||
void update_drdy0();
|
||||
void update_drdy1();
|
||||
void update_drdy2();
|
||||
|
||||
void scc_irq(bool status);
|
||||
|
||||
// memory access controller
|
||||
int m_ifc2;
|
||||
UINT8 m_task;
|
||||
|
||||
// DMA
|
||||
UINT8 m_dmamap[8];
|
||||
int m_dmadis;
|
||||
int m_sysscc;
|
||||
int m_sysfs;
|
||||
@ -233,44 +153,8 @@ public:
|
||||
UINT8 m_csb; // card select
|
||||
int m_atce; // V.24 channel A external clock enable
|
||||
int m_btce; // V.24 channel B external clock enable
|
||||
|
||||
// video
|
||||
int m_endisp; // enable display
|
||||
int m_clocks_disabled; // clocks disabled
|
||||
UINT16 m_gmdi; // video RAM data latch
|
||||
UINT16 m_wrm; // write mask latch
|
||||
UINT8 m_ms[16]; // mover sequence control
|
||||
UINT8 m_ds[16]; // display sequence control
|
||||
UINT8 m_flag; // flags
|
||||
UINT16 m_xsize; // X size
|
||||
UINT16 m_ysize; // Y size
|
||||
int m_udx; // up/down X
|
||||
int m_udy; // up/down Y
|
||||
UINT16 m_xfrom; // X from
|
||||
UINT16 m_xto; // X to
|
||||
UINT16 m_yto; // Y to
|
||||
UINT16 m_ty; // to Y
|
||||
UINT32 m_mfa; // mover from address
|
||||
UINT32 m_mta; // mover to address
|
||||
UINT8 m_sh; //
|
||||
UINT16 m_mdor; //
|
||||
int m_hold_1w_cyk; //
|
||||
int m_wrms0; //
|
||||
int m_wrms1; //
|
||||
int m_rmc; // row match count
|
||||
int m_cmc; // column match count
|
||||
int m_amm; // active mover mask
|
||||
};
|
||||
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// MACHINE CONFIGURATION
|
||||
//**************************************************************************
|
||||
|
||||
/*----------- defined in video/abc1600.c -----------*/
|
||||
|
||||
MACHINE_CONFIG_EXTERN( abc1600_video );
|
||||
|
||||
|
||||
#endif
|
||||
|
686
src/mess/machine/abc1600mac.c
Normal file
686
src/mess/machine/abc1600mac.c
Normal file
@ -0,0 +1,686 @@
|
||||
/**********************************************************************
|
||||
|
||||
Luxor ABC 1600 Memory Access Controller emulation
|
||||
|
||||
Copyright MESS Team.
|
||||
Visit http://mamedev.org for licensing and usage restrictions.
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
/*
|
||||
|
||||
TODO:
|
||||
|
||||
- segment/page RAM addresses are not correctly decoded, "sas/format/format" can't find the SASI interface because of this
|
||||
forcetask0 1 t0 0 t1 0 t2 0 t3 0
|
||||
sega19 0 task 0
|
||||
sega 000 segd 00 pga 008 pgd 4058 virtual 02c730 (should be 004730)
|
||||
*/
|
||||
|
||||
#include "abc1600mac.h"
|
||||
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// MACROS / CONSTANTS
|
||||
//**************************************************************************
|
||||
|
||||
#define LOG 0
|
||||
|
||||
|
||||
#define A0 BIT(offset, 0)
|
||||
#define A1 BIT(offset, 1)
|
||||
#define A2 BIT(offset, 2)
|
||||
#define A4 BIT(offset, 4)
|
||||
#define A7 BIT(offset, 7)
|
||||
#define A8 BIT(offset, 8)
|
||||
#define X11 BIT(offset, 11)
|
||||
#define X12 BIT(offset, 12)
|
||||
#define A17 BIT(offset, 17)
|
||||
#define A18 BIT(offset, 18)
|
||||
#define A19 BIT(offset, 19)
|
||||
|
||||
#define A10_A9_A8 ((offset >> 8) & 0x07)
|
||||
#define A2_A1_A0 (offset & 0x07)
|
||||
#define A1_A2 ((A1 << 1) | A2)
|
||||
#define A2_A1 ((offset >> 1) & 0x03)
|
||||
|
||||
#define FC0 BIT(fc, 0)
|
||||
#define FC1 BIT(fc, 1)
|
||||
#define FC2 BIT(fc, 2)
|
||||
|
||||
#define PAGE_WP BIT(page_data, 14)
|
||||
#define PAGE_NONX BIT(page_data, 15)
|
||||
|
||||
#define BOOTE BIT(m_task, 6)
|
||||
#define MAGIC BIT(m_task, 7)
|
||||
#define READ_MAGIC !MAGIC
|
||||
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// DEVICE DEFINITIONS
|
||||
//**************************************************************************
|
||||
|
||||
const device_type ABC1600_MAC = &device_creator<abc1600_mac_device>;
|
||||
|
||||
|
||||
DEVICE_ADDRESS_MAP_START( map, 8, abc1600_mac_device )
|
||||
AM_RANGE(0x00000, 0xfffff) AM_READWRITE(read, write)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
|
||||
static ADDRESS_MAP_START( program_map, AS_PROGRAM, 8, abc1600_mac_device )
|
||||
ADDRESS_MAP_END
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// ROM( abc1600_mac )
|
||||
//-------------------------------------------------
|
||||
|
||||
ROM_START( abc1600_mac )
|
||||
ROM_REGION( 0x4000, "boot", 0 )
|
||||
ROM_LOAD( "boot 6490356-04.1f", 0x0000, 0x4000, CRC(9372f6f2) SHA1(86f0681f7ef8dd190b49eda5e781881582e0c2a4) )
|
||||
|
||||
ROM_REGION( 0x104, "plds", 0 )
|
||||
ROM_LOAD( "1022 6490351-01.17e", 0x000, 0x104, CRC(5dd00d43) SHA1(a3871f0d796bea9df8f25d41b3169dd4b8ef65ab) ) // MAC register address decoder
|
||||
ROM_END
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// rom_region - device-specific ROM region
|
||||
//-------------------------------------------------
|
||||
|
||||
const rom_entry *abc1600_mac_device::device_rom_region() const
|
||||
{
|
||||
return ROM_NAME( abc1600_mac );
|
||||
}
|
||||
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// LIVE DEVICE
|
||||
//**************************************************************************
|
||||
|
||||
//-------------------------------------------------
|
||||
// abc1600_mac_device - constructor
|
||||
//-------------------------------------------------
|
||||
|
||||
abc1600_mac_device::abc1600_mac_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
|
||||
: device_t(mconfig, ABC1600_MAC, "ABC 1600 MAC", tag, owner, clock, "abc1600mac", __FILE__),
|
||||
device_memory_interface(mconfig, *this),
|
||||
m_space_config("program", ENDIANNESS_LITTLE, 8, 22, 0, *ADDRESS_MAP_NAME(program_map)),
|
||||
m_rom(*this, "boot"),
|
||||
m_segment_ram(*this, "segment_ram"),
|
||||
m_page_ram(*this, "page_ram")
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_start - device-specific startup
|
||||
//-------------------------------------------------
|
||||
|
||||
void abc1600_mac_device::device_start()
|
||||
{
|
||||
// get the CPU device
|
||||
m_cpu = machine().device<m68000_base_device>(m_cpu_tag);
|
||||
assert(m_cpu != NULL);
|
||||
|
||||
// allocate memory
|
||||
m_segment_ram.allocate(0x400);
|
||||
m_page_ram.allocate(0x400);
|
||||
|
||||
// HACK fill segment RAM or abcenix won't boot
|
||||
memset(m_segment_ram, 0xcd, 0x400);
|
||||
|
||||
// state saving
|
||||
save_item(NAME(m_ifc2));
|
||||
save_item(NAME(m_task));
|
||||
save_item(NAME(m_dmamap));
|
||||
save_item(NAME(m_cause));
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_reset - device-specific reset
|
||||
//-------------------------------------------------
|
||||
|
||||
void abc1600_mac_device::device_reset()
|
||||
{
|
||||
// clear task register
|
||||
m_task = 0;
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// memory_space_config - return a description of
|
||||
// any address spaces owned by this device
|
||||
//-------------------------------------------------
|
||||
|
||||
const address_space_config *abc1600_mac_device::memory_space_config(address_spacenum spacenum) const
|
||||
{
|
||||
return (spacenum == AS_PROGRAM) ? &m_space_config : NULL;
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// get_current_task -
|
||||
//-------------------------------------------------
|
||||
|
||||
int abc1600_mac_device::get_current_task(offs_t offset)
|
||||
{
|
||||
int force_task0 = !(m_ifc2 || A19);
|
||||
int t0 = !(BIT(m_task, 0) || force_task0);
|
||||
int t1 = !(BIT(m_task, 1) || force_task0);
|
||||
int t2 = !(BIT(m_task, 2) || force_task0);
|
||||
int t3 = !(BIT(m_task, 3) || force_task0);
|
||||
|
||||
return (t3 << 3) | (t2 << 2) | (t1 << 1) | t0;
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// get_segment_address -
|
||||
//-------------------------------------------------
|
||||
|
||||
offs_t abc1600_mac_device::get_segment_address(offs_t offset)
|
||||
{
|
||||
int sega19 = !(!(A8 || m_ifc2) || !A19);
|
||||
int task = get_current_task(offset);
|
||||
|
||||
return (task << 5) | (sega19 << 4) | ((offset >> 15) & 0x0f);
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// get_page_address -
|
||||
//-------------------------------------------------
|
||||
|
||||
offs_t abc1600_mac_device::get_page_address(offs_t offset, UINT8 segd)
|
||||
{
|
||||
return ((segd & 0x3f) << 4) | ((offset >> 11) & 0x0f);
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// translate_address -
|
||||
//-------------------------------------------------
|
||||
|
||||
offs_t abc1600_mac_device::translate_address(offs_t offset, int *nonx, int *wp)
|
||||
{
|
||||
// segment
|
||||
offs_t sega = get_segment_address(offset);
|
||||
UINT8 segd = m_segment_ram[sega];
|
||||
|
||||
// page
|
||||
offs_t pga = get_page_address(offset, segd);
|
||||
UINT16 page_data = m_page_ram[pga];
|
||||
|
||||
offs_t virtual_offset = ((page_data & 0x3ff) << 11) | (offset & 0x7ff);
|
||||
|
||||
if (PAGE_NONX)
|
||||
{
|
||||
//logerror("Bus error %06x : %06x\n", offset, virtual_offset);
|
||||
//m_cpu->set_input_line(M68K_LINE_BUSERROR, ASSERT_LINE);
|
||||
//m_cpu->set_input_line(M68K_LINE_BUSERROR, CLEAR_LINE);
|
||||
}
|
||||
|
||||
*nonx = PAGE_NONX;
|
||||
*wp = PAGE_WP;
|
||||
|
||||
return virtual_offset;
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// read_user_memory -
|
||||
//-------------------------------------------------
|
||||
|
||||
UINT8 abc1600_mac_device::read_user_memory(offs_t offset)
|
||||
{
|
||||
int nonx = 0, wp = 0;
|
||||
offs_t virtual_offset = translate_address(offset, &nonx, &wp);
|
||||
|
||||
return space().read_byte(virtual_offset);
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// write_user_memory -
|
||||
//-------------------------------------------------
|
||||
|
||||
void abc1600_mac_device::write_user_memory(offs_t offset, UINT8 data)
|
||||
{
|
||||
int nonx = 0, wp = 0;
|
||||
offs_t virtual_offset = translate_address(offset, &nonx, &wp);
|
||||
|
||||
//if (nonx || !wp) return;
|
||||
|
||||
space().write_byte(virtual_offset, data);
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// read_supervisor_memory -
|
||||
//-------------------------------------------------
|
||||
|
||||
UINT8 abc1600_mac_device::read_supervisor_memory(address_space &space, offs_t offset)
|
||||
{
|
||||
UINT8 data = 0;
|
||||
|
||||
if (!A2 && !A1)
|
||||
{
|
||||
// _EP
|
||||
data = page_r(space, offset);
|
||||
}
|
||||
else if (!A2 && A1 && A0)
|
||||
{
|
||||
// _ES
|
||||
data = segment_r(space, offset);
|
||||
}
|
||||
else if (A2 && A1 && A0)
|
||||
{
|
||||
// _CAUSE
|
||||
data = cause_r(space, offset);
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// write_supervisor_memory -
|
||||
//-------------------------------------------------
|
||||
|
||||
void abc1600_mac_device::write_supervisor_memory(address_space &space, offs_t offset, UINT8 data)
|
||||
{
|
||||
if (!A2 && !A1)
|
||||
{
|
||||
// _WEP
|
||||
page_w(space, offset, data);
|
||||
}
|
||||
else if (!A2 && A1 && A0)
|
||||
{
|
||||
// _WES
|
||||
segment_w(space, offset, data);
|
||||
}
|
||||
else if (A2 && !A1 && A0)
|
||||
{
|
||||
// W(C)
|
||||
task_w(space, offset, data);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// get_fc -
|
||||
//-------------------------------------------------
|
||||
|
||||
int abc1600_mac_device::get_fc()
|
||||
{
|
||||
UINT16 fc = m68k_get_fc(m_cpu);
|
||||
|
||||
m_ifc2 = !(!(MAGIC || FC0) || FC2);
|
||||
|
||||
return fc;
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// read -
|
||||
//-------------------------------------------------
|
||||
|
||||
READ8_MEMBER( abc1600_mac_device::read )
|
||||
{
|
||||
int fc = get_fc();
|
||||
|
||||
UINT8 data = 0;
|
||||
|
||||
if (!BOOTE && !A19 && !A18 && !A17)
|
||||
{
|
||||
// _BOOTCE
|
||||
data = m_rom->base()[offset & 0x3fff];
|
||||
}
|
||||
else if (A19 && !m_ifc2 && !FC1)
|
||||
{
|
||||
data = read_supervisor_memory(space, offset);
|
||||
}
|
||||
else
|
||||
{
|
||||
data = read_user_memory(offset);
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// write -
|
||||
//-------------------------------------------------
|
||||
|
||||
WRITE8_MEMBER( abc1600_mac_device::write )
|
||||
{
|
||||
int fc = get_fc();
|
||||
|
||||
if (A19 && !m_ifc2 && !FC1)
|
||||
{
|
||||
write_supervisor_memory(space, offset, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
write_user_memory(offset, data);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// cause_r -
|
||||
//-------------------------------------------------
|
||||
|
||||
READ8_MEMBER( abc1600_mac_device::cause_r )
|
||||
{
|
||||
/*
|
||||
|
||||
bit description
|
||||
|
||||
0 RSTBUT
|
||||
1 1
|
||||
2 DMAOK
|
||||
3 X16
|
||||
4 X17
|
||||
5 X18
|
||||
6 X19
|
||||
7 X20
|
||||
|
||||
*/
|
||||
|
||||
UINT8 data = 0x02;
|
||||
|
||||
// DMA status
|
||||
data |= m_cause;
|
||||
|
||||
machine().watchdog_reset();
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// task_w -
|
||||
//-------------------------------------------------
|
||||
|
||||
WRITE8_MEMBER( abc1600_mac_device::task_w )
|
||||
{
|
||||
/*
|
||||
|
||||
bit description
|
||||
|
||||
0 TASKD0* (inverted SEGA5)
|
||||
1 TASKD1* (inverted SEGA6)
|
||||
2 TASKD2* (inverted SEGA7)
|
||||
3 TASKD3* (inverted SEGA8)
|
||||
4
|
||||
5
|
||||
6 BOOTE*
|
||||
7 MAGIC*
|
||||
|
||||
*/
|
||||
|
||||
m_task = data ^ 0xff;
|
||||
|
||||
if (LOG) logerror("%s: %06x Task %u BOOTE %u MAGIC %u\n", machine().describe_context(), offset, get_current_task(offset), BOOTE, MAGIC);
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// segment_r -
|
||||
//-------------------------------------------------
|
||||
|
||||
READ8_MEMBER( abc1600_mac_device::segment_r )
|
||||
{
|
||||
/*
|
||||
|
||||
bit description
|
||||
|
||||
0 SEGD0
|
||||
1 SEGD1
|
||||
2 SEGD2
|
||||
3 SEGD3
|
||||
4 SEGD4
|
||||
5 SEGD5
|
||||
6 SEGD6
|
||||
7 READ_MAGIC
|
||||
|
||||
*/
|
||||
|
||||
offs_t sega = get_segment_address(offset);
|
||||
UINT8 segd = m_segment_ram[sega];
|
||||
|
||||
return (READ_MAGIC << 7) | (segd & 0x7f);
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// segment_w -
|
||||
//-------------------------------------------------
|
||||
|
||||
WRITE8_MEMBER( abc1600_mac_device::segment_w )
|
||||
{
|
||||
/*
|
||||
|
||||
bit description
|
||||
|
||||
0 SEGD0
|
||||
1 SEGD1
|
||||
2 SEGD2
|
||||
3 SEGD3
|
||||
4 SEGD4
|
||||
5 SEGD5
|
||||
6 SEGD6
|
||||
7 0
|
||||
|
||||
*/
|
||||
|
||||
offs_t sega = get_segment_address(offset);
|
||||
|
||||
m_segment_ram[sega] = data & 0x7f;
|
||||
|
||||
if (LOG) logerror("%s: %06x Task %u Segment %03x : %02x\n", machine().describe_context(), offset, get_current_task(offset), sega, data);
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// page_r -
|
||||
//-------------------------------------------------
|
||||
|
||||
READ8_MEMBER( abc1600_mac_device::page_r )
|
||||
{
|
||||
/*
|
||||
|
||||
bit description
|
||||
|
||||
0 X11
|
||||
1 X12
|
||||
2 X13
|
||||
3 X14
|
||||
4 X15
|
||||
5 X16
|
||||
6 X17
|
||||
7 X18
|
||||
|
||||
8 X19
|
||||
9 X20
|
||||
10 X20
|
||||
11 X20
|
||||
12 X20
|
||||
13 X20
|
||||
14 _WP
|
||||
15 NONX
|
||||
|
||||
*/
|
||||
|
||||
// segment
|
||||
offs_t sega = get_segment_address(offset);
|
||||
UINT8 segd = m_segment_ram[sega];
|
||||
|
||||
// page
|
||||
offs_t pga = get_page_address(offset, segd);
|
||||
UINT16 pgd = m_page_ram[pga];
|
||||
|
||||
UINT8 data = 0;
|
||||
|
||||
if (A0)
|
||||
{
|
||||
data = pgd & 0xff;
|
||||
}
|
||||
else
|
||||
{
|
||||
int x20 = BIT(pgd, 9);
|
||||
|
||||
data = (pgd >> 8) | (x20 << 2) | (x20 << 3) | (x20 << 4) | (x20 << 5);
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// page_w -
|
||||
//-------------------------------------------------
|
||||
|
||||
WRITE8_MEMBER( abc1600_mac_device::page_w )
|
||||
{
|
||||
/*
|
||||
|
||||
bit description
|
||||
|
||||
0 X11
|
||||
1 X12
|
||||
2 X13
|
||||
3 X14
|
||||
4 X15
|
||||
5 X16
|
||||
6 X17
|
||||
7 X18
|
||||
|
||||
8 X19
|
||||
9 X20
|
||||
10
|
||||
11
|
||||
12
|
||||
13
|
||||
14 _WP
|
||||
15 NONX
|
||||
|
||||
*/
|
||||
|
||||
// segment
|
||||
offs_t sega = get_segment_address(offset);
|
||||
UINT8 segd = m_segment_ram[sega];
|
||||
|
||||
// page
|
||||
offs_t pga = get_page_address(offset, segd);
|
||||
|
||||
if (A0)
|
||||
{
|
||||
m_page_ram[pga] = (m_page_ram[pga] & 0xff00) | data;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_page_ram[pga] = ((data & 0xc3) << 8) | (m_page_ram[pga] & 0xff);
|
||||
}
|
||||
|
||||
if (LOG) logerror("%s: %06x Task %u Segment %03x Page %03x : %02x -> %04x\n", machine().describe_context(), offset, get_current_task(offset), sega, pga, data, m_page_ram[pga]);
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// get_dma_address -
|
||||
//-------------------------------------------------
|
||||
|
||||
offs_t abc1600_mac_device::get_dma_address(int index, UINT16 offset)
|
||||
{
|
||||
// A0 = DMA15, A1 = BA1, A2 = BA2
|
||||
UINT8 dmamap_addr = index | BIT(offset, 15);
|
||||
UINT8 dmamap = m_dmamap[dmamap_addr];
|
||||
|
||||
m_cause = (dmamap & 0x1f) << 3;
|
||||
|
||||
return ((dmamap & 0x1f) << 16) | offset;
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// dma_mreq_r - DMA memory read
|
||||
//-------------------------------------------------
|
||||
|
||||
UINT8 abc1600_mac_device::dma_mreq_r(int index, UINT16 offset)
|
||||
{
|
||||
offs_t virtual_offset = get_dma_address(index, offset);
|
||||
|
||||
return space().read_byte(virtual_offset);
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// dma_mreq_w - DMA memory write
|
||||
//-------------------------------------------------
|
||||
|
||||
void abc1600_mac_device::dma_mreq_w(int index, UINT16 offset, UINT8 data)
|
||||
{
|
||||
offs_t virtual_offset = get_dma_address(index, offset);
|
||||
|
||||
space().write_byte(virtual_offset, data);
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// dma_iorq_r - DMA I/O read
|
||||
//-------------------------------------------------
|
||||
|
||||
UINT8 abc1600_mac_device::dma_iorq_r(int index, UINT16 offset)
|
||||
{
|
||||
offs_t virtual_offset = 0x1fe000 | get_dma_address(index, offset);
|
||||
|
||||
return space().read_byte(virtual_offset);
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// dma_iorq_w - DMA I/O write
|
||||
//-------------------------------------------------
|
||||
|
||||
void abc1600_mac_device::dma_iorq_w(int index, UINT16 offset, UINT8 data)
|
||||
{
|
||||
offs_t virtual_offset = 0x1fe000 | get_dma_address(index, offset);
|
||||
|
||||
space().write_byte(virtual_offset, data);
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// dmamap_w - DMA map write
|
||||
//-------------------------------------------------
|
||||
|
||||
WRITE8_MEMBER( abc1600_mac_device::dmamap_w )
|
||||
{
|
||||
/*
|
||||
|
||||
bit description
|
||||
|
||||
0 X16
|
||||
1 X17
|
||||
2 X18
|
||||
3 X19
|
||||
4 X20
|
||||
5
|
||||
6
|
||||
7 _R/W
|
||||
|
||||
*/
|
||||
|
||||
if (LOG) logerror("DMAMAP %u %02x\n", offset & 7, data);
|
||||
|
||||
m_dmamap[offset & 7] = data;
|
||||
}
|
137
src/mess/machine/abc1600mac.h
Normal file
137
src/mess/machine/abc1600mac.h
Normal file
@ -0,0 +1,137 @@
|
||||
/**********************************************************************
|
||||
|
||||
Luxor ABC 1600 Memory Access Controller emulation
|
||||
|
||||
Copyright MESS Team.
|
||||
Visit http://mamedev.org for licensing and usage restrictions.
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifndef __ABC1600_MAC__
|
||||
#define __ABC1600_MAC__
|
||||
|
||||
#include "emu.h"
|
||||
#include "cpu/m68000/m68000.h"
|
||||
|
||||
|
||||
|
||||
///*************************************************************************
|
||||
// MACROS / CONSTANTS
|
||||
///*************************************************************************
|
||||
|
||||
#define ABC1600_MAC_TAG "mac"
|
||||
|
||||
|
||||
|
||||
///*************************************************************************
|
||||
// INTERFACE CONFIGURATION MACROS
|
||||
///*************************************************************************
|
||||
|
||||
#define MCFG_ABC1600_MAC_ADD(_cpu_tag, _program_map) \
|
||||
MCFG_DEVICE_ADD(ABC1600_MAC_TAG, ABC1600_MAC, 0) \
|
||||
MCFG_DEVICE_ADDRESS_MAP(AS_PROGRAM, _program_map) \
|
||||
downcast<abc1600_mac_device *>(device)->set_cpu_tag(_cpu_tag);
|
||||
|
||||
|
||||
|
||||
///*************************************************************************
|
||||
// TYPE DEFINITIONS
|
||||
///*************************************************************************
|
||||
|
||||
// ======================> abc1600_mac_device
|
||||
|
||||
class abc1600_mac_device : public device_t,
|
||||
public device_memory_interface
|
||||
{
|
||||
public:
|
||||
abc1600_mac_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
// optional information overrides
|
||||
virtual const rom_entry *device_rom_region() const;
|
||||
|
||||
void set_cpu_tag(const char *cpu_tag) { m_cpu_tag = cpu_tag; }
|
||||
|
||||
virtual DECLARE_ADDRESS_MAP(map, 8);
|
||||
|
||||
DECLARE_READ8_MEMBER( cause_r );
|
||||
DECLARE_WRITE8_MEMBER( task_w );
|
||||
DECLARE_READ8_MEMBER( segment_r );
|
||||
DECLARE_WRITE8_MEMBER( segment_w );
|
||||
DECLARE_READ8_MEMBER( page_r );
|
||||
DECLARE_WRITE8_MEMBER( page_w );
|
||||
DECLARE_WRITE8_MEMBER( dmamap_w );
|
||||
|
||||
DECLARE_READ8_MEMBER( dma0_mreq_r ) { return dma_mreq_r(DMAMAP_R0_LO, offset); }
|
||||
DECLARE_WRITE8_MEMBER( dma0_mreq_w ) { dma_mreq_w(DMAMAP_R0_LO, offset, data); }
|
||||
DECLARE_READ8_MEMBER( dma0_iorq_r ) { return dma_iorq_r(DMAMAP_R0_LO, offset); }
|
||||
DECLARE_WRITE8_MEMBER( dma0_iorq_w ) { dma_iorq_w(DMAMAP_R0_LO, offset, data); }
|
||||
DECLARE_READ8_MEMBER( dma1_mreq_r ) { return dma_mreq_r(DMAMAP_R1_LO, offset); }
|
||||
DECLARE_WRITE8_MEMBER( dma1_mreq_w ) { dma_mreq_w(DMAMAP_R1_LO, offset, data); }
|
||||
DECLARE_READ8_MEMBER( dma1_iorq_r ) { return dma_iorq_r(DMAMAP_R1_LO, offset); }
|
||||
DECLARE_WRITE8_MEMBER( dma1_iorq_w ) { dma_iorq_w(DMAMAP_R1_LO, offset, data); }
|
||||
DECLARE_READ8_MEMBER( dma2_mreq_r ) { return dma_mreq_r(DMAMAP_R2_LO, offset); }
|
||||
DECLARE_WRITE8_MEMBER( dma2_mreq_w ) { dma_mreq_w(DMAMAP_R2_LO, offset, data); }
|
||||
DECLARE_READ8_MEMBER( dma2_iorq_r ) { return dma_iorq_r(DMAMAP_R2_LO, offset); }
|
||||
DECLARE_WRITE8_MEMBER( dma2_iorq_w ) { dma_iorq_w(DMAMAP_R2_LO, offset, data); }
|
||||
|
||||
protected:
|
||||
// device-level overrides
|
||||
virtual void device_start();
|
||||
virtual void device_reset();
|
||||
|
||||
// device_memory_interface overrides
|
||||
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_PROGRAM) const;
|
||||
|
||||
private:
|
||||
enum
|
||||
{
|
||||
DMAMAP_R2_LO = 0,
|
||||
DMAMAP_R2_HI,
|
||||
DMAMAP_R1_LO = 4,
|
||||
DMAMAP_R1_HI,
|
||||
DMAMAP_R0_LO,
|
||||
DMAMAP_R0_HI
|
||||
};
|
||||
|
||||
DECLARE_READ8_MEMBER( read );
|
||||
DECLARE_WRITE8_MEMBER( write );
|
||||
|
||||
int get_current_task(offs_t offset);
|
||||
offs_t get_segment_address(offs_t offset);
|
||||
offs_t get_page_address(offs_t offset, UINT8 segd);
|
||||
offs_t translate_address(offs_t offset, int *nonx, int *wp);
|
||||
UINT8 read_user_memory(offs_t offset);
|
||||
void write_user_memory(offs_t offset, UINT8 data);
|
||||
int get_fc();
|
||||
UINT8 read_supervisor_memory(address_space &space, offs_t offset);
|
||||
void write_supervisor_memory(address_space &space, offs_t offset, UINT8 data);
|
||||
offs_t get_dma_address(int index, UINT16 offset);
|
||||
UINT8 dma_mreq_r(int index, UINT16 offset);
|
||||
void dma_mreq_w(int index, UINT16 offset, UINT8 data);
|
||||
UINT8 dma_iorq_r(int index, UINT16 offset);
|
||||
void dma_iorq_w(int index, UINT16 offset, UINT8 data);
|
||||
|
||||
const address_space_config m_space_config;
|
||||
|
||||
required_memory_region m_rom;
|
||||
optional_shared_ptr<UINT8> m_segment_ram;
|
||||
optional_shared_ptr<UINT16> m_page_ram;
|
||||
|
||||
const char *m_cpu_tag;
|
||||
m68000_base_device *m_cpu;
|
||||
|
||||
int m_ifc2;
|
||||
UINT8 m_task;
|
||||
UINT8 m_dmamap[8];
|
||||
UINT8 m_cause;
|
||||
};
|
||||
|
||||
|
||||
// device type definition
|
||||
extern const device_type ABC1600_MAC;
|
||||
|
||||
|
||||
|
||||
#endif
|
@ -1570,6 +1570,7 @@ $(MESSOBJ)/luxor.a: \
|
||||
$(MESS_MACHINE)/abc890.o \
|
||||
$(MESS_DRIVERS)/abc1600.o \
|
||||
$(MESS_MACHINE)/abc1600_bus.o \
|
||||
$(MESS_MACHINE)/abc1600mac.o \
|
||||
$(MESS_MACHINE)/lux4105.o \
|
||||
$(MESS_VIDEO)/abc1600.o \
|
||||
$(MESS_MACHINE)/s1410.o \
|
||||
|
File diff suppressed because it is too large
Load Diff
150
src/mess/video/abc1600.h
Normal file
150
src/mess/video/abc1600.h
Normal file
@ -0,0 +1,150 @@
|
||||
/**********************************************************************
|
||||
|
||||
Luxor ABC 1600 Mover emulation
|
||||
|
||||
Copyright MESS Team.
|
||||
Visit http://mamedev.org for licensing and usage restrictions.
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifndef __ABC1600_MOVER__
|
||||
#define __ABC1600_MOVER__
|
||||
|
||||
#include "emu.h"
|
||||
#include "video/mc6845.h"
|
||||
|
||||
|
||||
|
||||
///*************************************************************************
|
||||
// INTERFACE CONFIGURATION MACROS
|
||||
///*************************************************************************
|
||||
|
||||
#define ABC1600_MOVER_TAG "mover"
|
||||
|
||||
|
||||
#define MCFG_ABC1600_MOVER_ADD() \
|
||||
MCFG_DEVICE_ADD(ABC1600_MOVER_TAG, ABC1600_MOVER, 0)
|
||||
|
||||
|
||||
|
||||
///*************************************************************************
|
||||
// TYPE DEFINITIONS
|
||||
///*************************************************************************
|
||||
|
||||
// ======================> abc1600_mover_device
|
||||
|
||||
class abc1600_mover_device : public device_t,
|
||||
public device_memory_interface
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
abc1600_mover_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
// optional information overrides
|
||||
virtual const rom_entry *device_rom_region() const;
|
||||
virtual machine_config_constructor device_mconfig_additions() const;
|
||||
|
||||
virtual DECLARE_ADDRESS_MAP(vram_map, 8);
|
||||
virtual DECLARE_ADDRESS_MAP(crtc_map, 8);
|
||||
virtual DECLARE_ADDRESS_MAP(io_map, 8);
|
||||
|
||||
UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||
|
||||
void crtc_update_row(device_t *device, bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT16 ma, UINT8 ra, UINT16 y, UINT8 x_count, INT8 cursor_x, void *param);
|
||||
|
||||
protected:
|
||||
// device-level overrides
|
||||
virtual void device_start();
|
||||
virtual void device_reset();
|
||||
|
||||
// device_memory_interface overrides
|
||||
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const;
|
||||
|
||||
private:
|
||||
inline UINT16 get_drmsk();
|
||||
inline void get_shinf();
|
||||
inline UINT16 get_wrmsk();
|
||||
inline UINT16 barrel_shift(UINT16 gmdr);
|
||||
inline UINT16 word_mixer(UINT16 rot);
|
||||
inline void clock_mfa_x();
|
||||
inline void clock_mfa_y();
|
||||
inline void clock_mta_x();
|
||||
inline void clock_mta_y();
|
||||
inline void load_mfa_x();
|
||||
inline void load_mta_x();
|
||||
inline void compare_mta_x();
|
||||
inline void compare_mta_y();
|
||||
inline void load_xy_reg();
|
||||
void mover();
|
||||
|
||||
DECLARE_READ8_MEMBER( video_ram_r );
|
||||
DECLARE_WRITE8_MEMBER( video_ram_w );
|
||||
|
||||
DECLARE_READ8_MEMBER( iord0_r );
|
||||
DECLARE_WRITE8_MEMBER( ldsx_hb_w );
|
||||
DECLARE_WRITE8_MEMBER( ldsx_lb_w );
|
||||
DECLARE_WRITE8_MEMBER( ldsy_hb_w );
|
||||
DECLARE_WRITE8_MEMBER( ldsy_lb_w );
|
||||
DECLARE_WRITE8_MEMBER( ldtx_hb_w );
|
||||
DECLARE_WRITE8_MEMBER( ldtx_lb_w );
|
||||
DECLARE_WRITE8_MEMBER( ldty_hb_w );
|
||||
DECLARE_WRITE8_MEMBER( ldty_lb_w );
|
||||
DECLARE_WRITE8_MEMBER( ldfx_hb_w );
|
||||
DECLARE_WRITE8_MEMBER( ldfx_lb_w );
|
||||
DECLARE_WRITE8_MEMBER( ldfy_hb_w );
|
||||
DECLARE_WRITE8_MEMBER( ldfy_lb_w );
|
||||
DECLARE_WRITE8_MEMBER( wrml_w );
|
||||
DECLARE_WRITE8_MEMBER( wrdl_w );
|
||||
DECLARE_WRITE8_MEMBER( wrmask_strobe_hb_w );
|
||||
DECLARE_WRITE8_MEMBER( wrmask_strobe_lb_w );
|
||||
DECLARE_WRITE8_MEMBER( enable_clocks_w );
|
||||
DECLARE_WRITE8_MEMBER( flag_strobe_w );
|
||||
DECLARE_WRITE8_MEMBER( endisp_w );
|
||||
|
||||
inline UINT16 read_videoram(offs_t offset);
|
||||
inline void write_videoram(offs_t offset, UINT16 data, UINT16 mask);
|
||||
inline UINT16 get_crtca(UINT16 ma, UINT8 ra, UINT8 column);
|
||||
|
||||
const address_space_config m_space_config;
|
||||
|
||||
required_device<mc6845_device> m_crtc;
|
||||
required_memory_region m_wrmsk_rom;
|
||||
required_memory_region m_shinf_rom;
|
||||
required_memory_region m_drmsk_rom;
|
||||
|
||||
int m_endisp; // enable display
|
||||
int m_clocks_disabled; // clocks disabled
|
||||
UINT16 m_gmdi; // video RAM data latch
|
||||
UINT16 m_wrm; // write mask latch
|
||||
UINT8 m_ms[16]; // mover sequence control
|
||||
UINT8 m_ds[16]; // display sequence control
|
||||
UINT8 m_flag; // flags
|
||||
UINT16 m_xsize; // X size
|
||||
UINT16 m_ysize; // Y size
|
||||
int m_udx; // up/down X
|
||||
int m_udy; // up/down Y
|
||||
UINT16 m_xfrom; // X from
|
||||
UINT16 m_xto; // X to
|
||||
UINT16 m_yto; // Y to
|
||||
UINT16 m_ty; // to Y
|
||||
UINT32 m_mfa; // mover from address
|
||||
UINT32 m_mta; // mover to address
|
||||
UINT8 m_sh; //
|
||||
UINT16 m_mdor; //
|
||||
int m_hold_1w_cyk; //
|
||||
int m_wrms0; //
|
||||
int m_wrms1; //
|
||||
int m_rmc; // row match count
|
||||
int m_cmc; // column match count
|
||||
int m_amm; // active mover mask
|
||||
};
|
||||
|
||||
|
||||
// device type definition
|
||||
extern const device_type ABC1600_MOVER;
|
||||
|
||||
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user