cedar_magnet*.cpp : Updates

Simplify handlers, Reduce unnecessary lines, Duplicates, Runtime tag lookups, Convert arrays into std::unique_ptr, Fix namings, Spacings, Use shorter type values,
This commit is contained in:
cam900 2019-05-01 03:38:10 +09:00
parent 79d5d49e8a
commit 88986d1c53
9 changed files with 235 additions and 241 deletions

View File

@ -133,27 +133,28 @@ class cedar_magnet_state : public driver_device
{ {
public: public:
cedar_magnet_state(const machine_config &mconfig, device_type type, const char *tag) cedar_magnet_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag), : driver_device(mconfig, type, tag)
m_bank0(*this, "bank0"), , m_bank0(*this, "bank0")
m_sub_ram_bankdev(*this, "mb_sub_ram"), , m_sub_ram_bankdev(*this, "mb_sub_ram")
m_sub_pal_bankdev(*this, "mb_sub_pal"), , m_sub_pal_bankdev(*this, "mb_sub_pal")
m_ram0(*this, "ram0"), , m_ram0(*this, "ram0")
m_pal_r(*this, "pal_r"), , m_pal_r(*this, "pal_r")
m_pal_g(*this, "pal_g"), , m_pal_g(*this, "pal_g")
m_pal_b(*this, "pal_b"), , m_pal_b(*this, "pal_b")
m_ic48_pio(*this, "z80pio_ic48"), , m_ic48_pio(*this, "z80pio_ic48")
m_ic49_pio(*this, "z80pio_ic49"), , m_ic49_pio(*this, "z80pio_ic49")
m_ic48_pio_pa_val(0xff), , m_io_coin(*this, "COIN%u", 1U)
m_ic48_pio_pb_val(0xff), , m_ic48_pio_pa_val(0xff)
m_ic49_pio_pb_val(0xff), , m_ic48_pio_pb_val(0xff)
m_address1hack(-1), , m_ic49_pio_pb_val(0xff)
m_address2hack(-1), , m_address1hack(-1)
m_palette(*this, "palette"), , m_address2hack(-1)
m_maincpu(*this, "maincpu"), , m_palette(*this, "palette")
m_cedsound(*this, "cedtop"), , m_maincpu(*this, "maincpu")
m_cedplane0(*this, "cedplane0"), , m_cedsound(*this, "cedtop")
m_cedplane1(*this, "cedplane1"), , m_cedplane0(*this, "cedplane0")
m_cedsprite(*this, "cedsprite") , m_cedplane1(*this, "cedplane1")
, m_cedsprite(*this, "cedsprite")
{ {
} }
@ -164,54 +165,56 @@ private:
required_device<address_map_bank_device> m_sub_ram_bankdev; required_device<address_map_bank_device> m_sub_ram_bankdev;
required_device<address_map_bank_device> m_sub_pal_bankdev; required_device<address_map_bank_device> m_sub_pal_bankdev;
required_shared_ptr<uint8_t> m_ram0; required_shared_ptr<u8> m_ram0;
required_shared_ptr<uint8_t> m_pal_r; required_shared_ptr<u8> m_pal_r;
required_shared_ptr<uint8_t> m_pal_g; required_shared_ptr<u8> m_pal_g;
required_shared_ptr<uint8_t> m_pal_b; required_shared_ptr<u8> m_pal_b;
required_device<z80pio_device> m_ic48_pio; required_device<z80pio_device> m_ic48_pio;
required_device<z80pio_device> m_ic49_pio; required_device<z80pio_device> m_ic49_pio;
uint8_t ic48_pio_pa_r(); optional_ioport_array<2> m_io_coin;
void ic48_pio_pa_w(uint8_t data);
uint8_t ic48_pio_pb_r(); u8 ic48_pio_pa_r();
void ic48_pio_pb_w(uint8_t data); void ic48_pio_pa_w(u8 data);
uint8_t ic49_pio_pb_r(); u8 ic48_pio_pb_r();
void ic49_pio_pb_w(uint8_t data); void ic48_pio_pb_w(u8 data);
u8 ic49_pio_pb_r();
void ic49_pio_pb_w(u8 data);
// 1x range ports // 1x range ports
void port18_w(uint8_t data); void port18_w(u8 data);
void port19_w(uint8_t data); void port19_w(u8 data);
void port1b_w(uint8_t data); void port1b_w(u8 data);
uint8_t port18_r(); u8 port18_r();
uint8_t port19_r(); u8 port19_r();
uint8_t port1a_r(); u8 port1a_r();
// 7x range ports // 7x range ports
void rambank_palbank_w(uint8_t data); void rambank_palbank_w(u8 data);
void palupload_w(uint8_t data); void palupload_w(u8 data);
void paladdr_w(uint8_t data); void paladdr_w(u8 data);
uint8_t watchdog_r(); u8 watchdog_r();
uint8_t port7c_r(); u8 port7c_r();
// other ports // other ports
uint8_t other_cpu_r(offs_t offset); u8 other_cpu_r(offs_t offset);
void other_cpu_w(offs_t offset, uint8_t data); void other_cpu_w(offs_t offset, u8 data);
uint8_t m_paladdr; u8 m_paladdr;
int m_palbank; int m_palbank;
uint8_t m_ic48_pio_pa_val; u8 m_ic48_pio_pa_val;
uint8_t m_ic48_pio_pb_val; u8 m_ic48_pio_pb_val;
uint8_t m_ic49_pio_pb_val; u8 m_ic49_pio_pb_val;
void set_palette(int offset); void set_palette(int offset);
void palette_r_w(offs_t offset, uint8_t data); void palette_r_w(offs_t offset, u8 data);
void palette_g_w(offs_t offset, uint8_t data); void palette_g_w(offs_t offset, u8 data);
void palette_b_w(offs_t offset, uint8_t data); void palette_b_w(offs_t offset, u8 data);
void handle_sub_board_cpu_lines(cedar_magnet_board_interface &dev, int old_data, int data); void handle_sub_board_cpu_lines(cedar_magnet_board_interface &dev, int old_data, int data);
INTERRUPT_GEN_MEMBER(irq); INTERRUPT_GEN_MEMBER(irq);
@ -222,7 +225,7 @@ private:
virtual void machine_start() override; virtual void machine_start() override;
virtual void machine_reset() override; virtual void machine_reset() override;
virtual void video_start() override; virtual void video_start() override;
uint32_t screen_update_cedar_magnet(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
required_device<palette_device> m_palette; required_device<palette_device> m_palette;
required_device<cpu_device> m_maincpu; required_device<cpu_device> m_maincpu;
@ -317,7 +320,7 @@ void cedar_magnet_state::cedar_bank0(address_map &map)
***********************/ ***********************/
void cedar_magnet_state::rambank_palbank_w(uint8_t data) void cedar_magnet_state::rambank_palbank_w(u8 data)
{ {
// ---- --xx // ---- --xx
// xx = program bank // xx = program bank
@ -329,17 +332,17 @@ void cedar_magnet_state::rambank_palbank_w(uint8_t data)
m_sub_pal_bankdev->set_bank(palbank); m_sub_pal_bankdev->set_bank(palbank);
} }
void cedar_magnet_state::palupload_w(uint8_t data) void cedar_magnet_state::palupload_w(u8 data)
{ {
m_sub_pal_bankdev->write8(m_paladdr, data); m_sub_pal_bankdev->write8(m_paladdr, data);
} }
void cedar_magnet_state::paladdr_w(uint8_t data) void cedar_magnet_state::paladdr_w(u8 data)
{ {
m_paladdr = data; m_paladdr = data;
} }
uint8_t cedar_magnet_state::watchdog_r() u8 cedar_magnet_state::watchdog_r()
{ {
// watchdog // watchdog
return 0x00; return 0x00;
@ -352,7 +355,7 @@ uint8_t cedar_magnet_state::watchdog_r()
***********************/ ***********************/
uint8_t cedar_magnet_state::port7c_r() u8 cedar_magnet_state::port7c_r()
{ {
//logerror("%s: port7c_r\n", machine().describe_context()); //logerror("%s: port7c_r\n", machine().describe_context());
return 0x01; return 0x01;
@ -366,20 +369,20 @@ uint8_t cedar_magnet_state::port7c_r()
***********************/ ***********************/
uint8_t cedar_magnet_state::port18_r() u8 cedar_magnet_state::port18_r()
{ {
// logerror("%s: port18_r\n", machine().describe_context()); // logerror("%s: port18_r\n", machine().describe_context());
return 0x00; return 0x00;
} }
void cedar_magnet_state::port18_w(uint8_t data) void cedar_magnet_state::port18_w(u8 data)
{ {
// logerror("%s: port18_w %02x\n", machine().describe_context(), data); // logerror("%s: port18_w %02x\n", machine().describe_context(), data);
} }
uint8_t cedar_magnet_state::port19_r() u8 cedar_magnet_state::port19_r()
{ {
uint8_t ret = 0x00; u8 ret = 0x00;
// logerror("%s: port19_r\n", machine().describe_context()); // logerror("%s: port19_r\n", machine().describe_context());
// 9496 in a,($19) // 9496 in a,($19)
@ -390,19 +393,19 @@ uint8_t cedar_magnet_state::port19_r()
return ret; return ret;
} }
uint8_t cedar_magnet_state::port1a_r() u8 cedar_magnet_state::port1a_r()
{ {
// logerror("%s: port1a_r\n", machine().describe_context()); // logerror("%s: port1a_r\n", machine().describe_context());
return 0x00; return 0x00;
} }
void cedar_magnet_state::port19_w(uint8_t data) void cedar_magnet_state::port19_w(u8 data)
{ {
// logerror("%s: port19_w %02x\n", machine().describe_context(), data); // logerror("%s: port19_w %02x\n", machine().describe_context(), data);
} }
void cedar_magnet_state::port1b_w(uint8_t data) void cedar_magnet_state::port1b_w(u8 data)
{ {
// logerror("%s: port1b_w %02x\n", machine().describe_context(), data); // logerror("%s: port1b_w %02x\n", machine().describe_context(), data);
} }
@ -418,27 +421,26 @@ void cedar_magnet_state::set_palette(int offset)
m_palette->set_pen_color(offset^0xff, pal4bit(m_pal_r[offset]), pal4bit(m_pal_g[offset]), pal4bit(m_pal_b[offset])); m_palette->set_pen_color(offset^0xff, pal4bit(m_pal_r[offset]), pal4bit(m_pal_g[offset]), pal4bit(m_pal_b[offset]));
} }
void cedar_magnet_state::palette_r_w(offs_t offset, uint8_t data) void cedar_magnet_state::palette_r_w(offs_t offset, u8 data)
{ {
m_pal_r[offset] = data; m_pal_r[offset] = data;
set_palette(offset); set_palette(offset);
} }
void cedar_magnet_state::palette_g_w(offs_t offset, uint8_t data) void cedar_magnet_state::palette_g_w(offs_t offset, u8 data)
{ {
m_pal_g[offset] = data; m_pal_g[offset] = data;
set_palette(offset); set_palette(offset);
} }
void cedar_magnet_state::palette_b_w(offs_t offset, uint8_t data) void cedar_magnet_state::palette_b_w(offs_t offset, u8 data)
{ {
m_pal_b[offset] = data; m_pal_b[offset] = data;
set_palette(offset); set_palette(offset);
} }
uint32_t cedar_magnet_state::screen_update_cedar_magnet(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) u32 cedar_magnet_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{ {
bitmap.fill(m_palette->black_pen(), cliprect); bitmap.fill(m_palette->black_pen(), cliprect);
int pal = (m_palbank >> 6); int pal = (m_palbank >> 6);
@ -460,7 +462,7 @@ void cedar_magnet_state::video_start()
***********************/ ***********************/
uint8_t cedar_magnet_state::other_cpu_r(offs_t offset) u8 cedar_magnet_state::other_cpu_r(offs_t offset)
{ {
int bankbit0 = (m_ic48_pio_pa_val & 0x60) >> 5; int bankbit0 = (m_ic48_pio_pa_val & 0x60) >> 5;
int plane0select = (m_ic48_pio_pa_val & 0x07) >> 0; int plane0select = (m_ic48_pio_pa_val & 0x07) >> 0;
@ -471,7 +473,7 @@ uint8_t cedar_magnet_state::other_cpu_r(offs_t offset)
int unk2 = (m_ic49_pio_pb_val & 0x03) >> 0; int unk2 = (m_ic49_pio_pb_val & 0x03) >> 0;
int cpus_accessed = 0; int cpus_accessed = 0;
uint8_t ret = 0x00; u8 ret = 0x00;
int offset2 = offset + windowbank * 0x4000; int offset2 = offset + windowbank * 0x4000;
@ -509,7 +511,7 @@ uint8_t cedar_magnet_state::other_cpu_r(offs_t offset)
return ret; return ret;
} }
void cedar_magnet_state::other_cpu_w(offs_t offset, uint8_t data) void cedar_magnet_state::other_cpu_w(offs_t offset, u8 data)
{ {
int bankbit0 = (m_ic48_pio_pa_val & 0x60) >> 5; int bankbit0 = (m_ic48_pio_pa_val & 0x60) >> 5;
int plane0select = (m_ic48_pio_pa_val & 0x07) >> 0; int plane0select = (m_ic48_pio_pa_val & 0x07) >> 0;
@ -579,11 +581,11 @@ void cedar_magnet_state::handle_sub_board_cpu_lines(cedar_magnet_board_interface
***********************/ ***********************/
uint8_t cedar_magnet_state::ic48_pio_pa_r() // 0x20 u8 cedar_magnet_state::ic48_pio_pa_r() // 0x20
{ {
uint8_t ret = m_ic48_pio_pa_val & ~0x08; u8 ret = m_ic48_pio_pa_val & ~0x08;
ret |= ioport("COIN1")->read()<<3; ret |= m_io_coin[0]->read()<<3;
if (!m_cedplane0->is_running()) ret &= ~0x01; if (!m_cedplane0->is_running()) ret &= ~0x01;
// interrupt source stuff?? // interrupt source stuff??
@ -593,7 +595,7 @@ uint8_t cedar_magnet_state::ic48_pio_pa_r() // 0x20
return ret; return ret;
} }
void cedar_magnet_state::ic48_pio_pa_w(uint8_t data) // 0x20 void cedar_magnet_state::ic48_pio_pa_w(u8 data) // 0x20
{ {
int oldplane0select = (m_ic48_pio_pa_val & 0x07) >> 0; int oldplane0select = (m_ic48_pio_pa_val & 0x07) >> 0;
@ -621,11 +623,11 @@ void cedar_magnet_state::ic48_pio_pa_w(uint8_t data) // 0x20
} }
uint8_t cedar_magnet_state::ic48_pio_pb_r() // 0x22 u8 cedar_magnet_state::ic48_pio_pb_r() // 0x22
{ {
uint8_t ret = m_ic48_pio_pb_val & ~0x80; u8 ret = m_ic48_pio_pb_val & ~0x80;
ret |= ioport("COIN2")->read()<<7; ret |= m_io_coin[1]->read()<<7;
if (!m_cedsprite->is_running()) ret &= ~0x10; if (!m_cedsprite->is_running()) ret &= ~0x10;
if (!m_cedplane1->is_running()) ret &= ~0x01; if (!m_cedplane1->is_running()) ret &= ~0x01;
@ -634,7 +636,7 @@ uint8_t cedar_magnet_state::ic48_pio_pb_r() // 0x22
return ret; return ret;
} }
void cedar_magnet_state::ic48_pio_pb_w(uint8_t data) // 0x22 void cedar_magnet_state::ic48_pio_pb_w(u8 data) // 0x22
{ {
int oldplane1select = (m_ic48_pio_pb_val & 0x07) >> 0; int oldplane1select = (m_ic48_pio_pb_val & 0x07) >> 0;
int oldspriteselect = (m_ic48_pio_pb_val & 0x70) >> 4; int oldspriteselect = (m_ic48_pio_pb_val & 0x70) >> 4;
@ -667,9 +669,9 @@ void cedar_magnet_state::ic48_pio_pb_w(uint8_t data) // 0x22
***********************/ ***********************/
uint8_t cedar_magnet_state::ic49_pio_pb_r() // 0x42 u8 cedar_magnet_state::ic49_pio_pb_r() // 0x42
{ {
uint8_t ret = m_ic49_pio_pb_val; u8 ret = m_ic49_pio_pb_val;
if (!m_cedsound->is_running()) ret &= ~0x10; if (!m_cedsound->is_running()) ret &= ~0x10;
@ -677,7 +679,7 @@ uint8_t cedar_magnet_state::ic49_pio_pb_r() // 0x42
return ret; return ret;
} }
void cedar_magnet_state::ic49_pio_pb_w(uint8_t data) // 0x42 void cedar_magnet_state::ic49_pio_pb_w(u8 data) // 0x42
{ {
int oldsoundselect = (m_ic49_pio_pb_val & 0x70) >> 4; int oldsoundselect = (m_ic49_pio_pb_val & 0x70) >> 4;
@ -799,7 +801,7 @@ void cedar_magnet_state::cedar_magnet(machine_config &config)
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
screen.set_size(256, 256); screen.set_size(256, 256);
screen.set_visarea(0, 256-8-1, 0, 192-1); screen.set_visarea(0, 256-8-1, 0, 192-1);
screen.set_screen_update(FUNC(cedar_magnet_state::screen_update_cedar_magnet)); screen.set_screen_update(FUNC(cedar_magnet_state::screen_update));
screen.set_palette(m_palette); screen.set_palette(m_palette);
PALETTE(config, m_palette).set_entries(0x400); PALETTE(config, m_palette).set_entries(0x400);

View File

@ -17,7 +17,7 @@ void cedar_magnet_board_interface::write_cpu_bus(int offset, u8 data)
ap.write_byte(offset, data); ap.write_byte(offset, data);
} }
uint8_t cedar_magnet_board_interface::read_cpu_bus(int offset) u8 cedar_magnet_board_interface::read_cpu_bus(int offset)
{ {
address_space &ap = m_cpu->space(AS_PROGRAM); address_space &ap = m_cpu->space(AS_PROGRAM);
return ap.read_byte(offset); return ap.read_byte(offset);

View File

@ -21,7 +21,7 @@ public:
u8 *ram() { return &m_ram[0]; } u8 *ram() { return &m_ram[0]; }
virtual u8 read_cpu_bus(int offset); virtual u8 read_cpu_bus(int offset);
virtual void write_cpu_bus(int offset, uint8_t data); virtual void write_cpu_bus(int offset, u8 data);
void irq_hold(); void irq_hold();
void halt_assert(); void halt_assert();

View File

@ -12,6 +12,7 @@ DEFINE_DEVICE_TYPE(CEDAR_MAGNET_FLOP, cedar_magnet_flop_device, "cedmag_flop", "
cedar_magnet_flop_device::cedar_magnet_flop_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) cedar_magnet_flop_device::cedar_magnet_flop_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, CEDAR_MAGNET_FLOP, tag, owner, clock) : device_t(mconfig, CEDAR_MAGNET_FLOP, tag, owner, clock)
, m_disk(*this, "disk")
{ {
} }
@ -36,27 +37,26 @@ void cedar_magnet_flop_device::device_reset()
m_floptrk = 0; m_floptrk = 0;
} }
READ8_MEMBER(cedar_magnet_flop_device::port60_r) u8 cedar_magnet_flop_device::port60_r()
{ {
uint8_t ret = m_flopstat; u8 ret = m_flopstat;
return ret; return ret;
} }
READ8_MEMBER(cedar_magnet_flop_device::port61_r) u8 cedar_magnet_flop_device::port61_r()
{ {
uint8_t ret = m_curtrack; u8 ret = m_curtrack;
return ret; return ret;
} }
READ8_MEMBER(cedar_magnet_flop_device::port63_r) u8 cedar_magnet_flop_device::port63_r()
{ {
uint8_t ret = machine().rand(); u8 ret = machine().rand();
// printf("%s: port63_r (DATA) (%02x)\n", machine().describe_context().c_str(), ret); // printf("%s: port63_r (DATA) (%02x)\n", machine().describe_context().c_str(), ret);
if ((m_flopcmd&0xf0) == 0x90) // reading data if ((m_flopcmd&0xf0) == 0x90) // reading data
{ {
uint8_t *flop = memregion("disk")->base();
int side = (m_flopcmd & 0x02)>>1; int side = (m_flopcmd & 0x02)>>1;
int read_offset_base = (m_flopsec * 0x400) + (m_curtrack * 0x3000) + (side * 0x1800); int read_offset_base = (m_flopsec * 0x400) + (m_curtrack * 0x3000) + (side * 0x1800);
@ -67,7 +67,7 @@ READ8_MEMBER(cedar_magnet_flop_device::port63_r)
m_flopstat |= 0x05; m_flopstat |= 0x05;
int read_offset = read_offset_base + m_secoffs; int read_offset = read_offset_base + m_secoffs;
ret = flop[read_offset]; ret = m_disk[read_offset];
if (m_secoffs == 0) if (m_secoffs == 0)
{ {
@ -102,7 +102,7 @@ READ8_MEMBER(cedar_magnet_flop_device::port63_r)
return ret; return ret;
} }
WRITE8_MEMBER(cedar_magnet_flop_device::port60_w) void cedar_magnet_flop_device::port60_w(u8 data)
{ {
//printf("%s: port60_w (COMMAND) %02x\n", machine().describe_context().c_str(), data); //printf("%s: port60_w (COMMAND) %02x\n", machine().describe_context().c_str(), data);
m_flopcmd = data; m_flopcmd = data;
@ -149,7 +149,7 @@ WRITE8_MEMBER(cedar_magnet_flop_device::port60_w)
} }
WRITE8_MEMBER(cedar_magnet_flop_device::port62_w) void cedar_magnet_flop_device::port62_w(u8 data)
{ {
//printf("%s: port62_w (SECTOR) %02x\n", machine().describe_context().c_str(), data); //printf("%s: port62_w (SECTOR) %02x\n", machine().describe_context().c_str(), data);
m_flopsec = data; m_flopsec = data;
@ -162,14 +162,13 @@ WRITE8_MEMBER(cedar_magnet_flop_device::port62_w)
m_flopsec -= 200; m_flopsec -= 200;
} }
WRITE8_MEMBER(cedar_magnet_flop_device::port63_w) void cedar_magnet_flop_device::port63_w(u8 data)
{ {
//printf("%s: port63_w (DATA) %02x\n", machine().describe_context().c_str(), data); //printf("%s: port63_w (DATA) %02x\n", machine().describe_context().c_str(), data);
m_flopdat = data; m_flopdat = data;
if ((m_flopcmd & 0xf0) == 0xb0) // writing data if ((m_flopcmd & 0xf0) == 0xb0) // writing data
{ {
uint8_t *flop = memregion("disk")->base();
int side = (m_flopcmd & 0x02)>>1; int side = (m_flopcmd & 0x02)>>1;
int read_offset_base = (m_flopsec * 0x400) + (m_curtrack * 0x3000) + (side * 0x1800); int read_offset_base = (m_flopsec * 0x400) + (m_curtrack * 0x3000) + (side * 0x1800);
@ -180,7 +179,7 @@ WRITE8_MEMBER(cedar_magnet_flop_device::port63_w)
m_flopstat |= 0x05; m_flopstat |= 0x05;
int read_offset = read_offset_base + m_secoffs; int read_offset = read_offset_base + m_secoffs;
flop[read_offset] = data; m_disk[read_offset] = data;
if (m_secoffs == 0) if (m_secoffs == 0)
{ {
@ -206,10 +205,10 @@ WRITE8_MEMBER(cedar_magnet_flop_device::write)
{ {
switch (offset & 3) switch (offset & 3)
{ {
case 0x00:port60_w(space, offset, data);break; case 0x00:port60_w(data);break;
// case 0x01:port61_w(space, offset, data);break; // case 0x01:port61_w(space, offset, data);break;
case 0x02:port62_w(space, offset, data);break; case 0x02:port62_w(data);break;
case 0x03:port63_w(space, offset, data);break; case 0x03:port63_w(data);break;
default:break; default:break;
} }
} }
@ -218,10 +217,10 @@ READ8_MEMBER(cedar_magnet_flop_device::read)
{ {
switch (offset & 3) switch (offset & 3)
{ {
case 0x00: return port60_r(space, offset); case 0x00: return port60_r();
case 0x01: return port61_r(space, offset); case 0x01: return port61_r();
//case 0x02: return port62_r(space, offset); //case 0x02: return port62_r(space, offset);
case 0x03: return port63_r(space, offset); case 0x03: return port63_r();
default: return 0x00; default: return 0x00;
} }

View File

@ -16,13 +16,13 @@ public:
// construction/destruction // construction/destruction
cedar_magnet_flop_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); cedar_magnet_flop_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
DECLARE_READ8_MEMBER(port60_r); u8 port60_r();
DECLARE_READ8_MEMBER(port61_r); u8 port61_r();
DECLARE_READ8_MEMBER(port63_r); u8 port63_r();
DECLARE_WRITE8_MEMBER(port60_w); void port60_w(u8 data);
DECLARE_WRITE8_MEMBER(port62_w); void port62_w(u8 data);
DECLARE_WRITE8_MEMBER(port63_w); void port63_w(u8 data);
DECLARE_READ8_MEMBER(read); DECLARE_READ8_MEMBER(read);
DECLARE_WRITE8_MEMBER(write); DECLARE_WRITE8_MEMBER(write);
@ -33,13 +33,14 @@ protected:
virtual void device_reset() override; virtual void device_reset() override;
private: private:
uint8_t m_flopdat; required_region_ptr<u8> m_disk;
uint8_t m_flopcmd; u8 m_flopdat;
uint8_t m_flopsec; u8 m_flopcmd;
uint8_t m_flopstat; u8 m_flopsec;
uint8_t m_floptrk; u8 m_flopstat;
u8 m_floptrk;
uint8_t m_curtrack; u8 m_curtrack;
int m_secoffs; int m_secoffs;
}; };

View File

@ -9,14 +9,13 @@
DEFINE_DEVICE_TYPE(CEDAR_MAGNET_PLANE, cedar_magnet_plane_device, "cedmag_plane", "Cedar Plane") DEFINE_DEVICE_TYPE(CEDAR_MAGNET_PLANE, cedar_magnet_plane_device, "cedmag_plane", "Cedar Plane")
cedar_magnet_plane_device::cedar_magnet_plane_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) cedar_magnet_plane_device::cedar_magnet_plane_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, CEDAR_MAGNET_PLANE, tag, owner, clock) : device_t(mconfig, CEDAR_MAGNET_PLANE, tag, owner, clock)
, cedar_magnet_board_interface(mconfig, *this, "planecpu", "ram") , cedar_magnet_board_interface(mconfig, *this, "planecpu", "ram")
{ {
} }
void cedar_magnet_plane_device::cedar_magnet_plane_map(address_map &map) void cedar_magnet_plane_device::cedar_magnet_plane_map(address_map &map)
{ {
map(0x0000, 0xffff).ram().share("ram"); map(0x0000, 0xffff).ram().share("ram");
@ -37,11 +36,9 @@ void cedar_magnet_plane_device::cedar_magnet_plane_io(address_map &map)
} }
void cedar_magnet_plane_device::plane_portcc_w(u8 data)
WRITE8_MEMBER(cedar_magnet_plane_device::plane_portcc_w)
{ {
m_framebuffer[((m_curline&0xff)*0x100)+(m_lineoffset&0xff)] = data; m_framebuffer[((m_curline & 0xff) * 0x100) + (m_lineoffset & 0xff)] = data;
// counters simply wrap when they reach the maximum, don't move onto next row/colummn (confirmed by xain) // counters simply wrap when they reach the maximum, don't move onto next row/colummn (confirmed by xain)
if (m_pio0_pa_data&0x01) if (m_pio0_pa_data&0x01)
@ -54,18 +51,17 @@ WRITE8_MEMBER(cedar_magnet_plane_device::plane_portcc_w)
} }
} }
WRITE8_MEMBER(cedar_magnet_plane_device::plane_portcd_w) void cedar_magnet_plane_device::plane_portcd_w(u8 data)
{ {
m_lineoffset = data; m_lineoffset = data;
} }
WRITE8_MEMBER(cedar_magnet_plane_device::plane_portce_w) void cedar_magnet_plane_device::plane_portce_w(u8 data)
{ {
m_curline = data; m_curline = data;
} }
WRITE8_MEMBER(cedar_magnet_plane_device::plane_portcf_w) void cedar_magnet_plane_device::plane_portcf_w(u8 data)
{ {
// does it have a meaning or is it just some kind of watchdog? // does it have a meaning or is it just some kind of watchdog?
m_cf_data = data; m_cf_data = data;
@ -93,7 +89,7 @@ void cedar_magnet_plane_device::device_add_mconfig(machine_config &config)
} }
READ8_MEMBER(cedar_magnet_plane_device::pio0_pa_r) u8 cedar_magnet_plane_device::pio0_pa_r()
{ {
// this is read // this is read
// logerror("%s: pio0_pa_r\n", machine().describe_context()); // logerror("%s: pio0_pa_r\n", machine().describe_context());
@ -101,7 +97,7 @@ READ8_MEMBER(cedar_magnet_plane_device::pio0_pa_r)
} }
WRITE8_MEMBER(cedar_magnet_plane_device::pio0_pa_w) void cedar_magnet_plane_device::pio0_pa_w(u8 data)
{ {
m_pio0_pa_data = data; m_pio0_pa_data = data;
@ -114,43 +110,44 @@ WRITE8_MEMBER(cedar_magnet_plane_device::pio0_pa_w)
// 321 = always set after startup? // 321 = always set after startup?
} }
WRITE8_MEMBER(cedar_magnet_plane_device::pio0_pb_w) void cedar_magnet_plane_device::pio0_pb_w(u8 data)
{ {
m_pio0_pb_data = data; m_pio0_pb_data = data;
} }
WRITE8_MEMBER(cedar_magnet_plane_device::pio1_pa_w) void cedar_magnet_plane_device::pio1_pa_w(u8 data)
{ {
m_scrollx = data; m_scrollx = data;
} }
WRITE8_MEMBER(cedar_magnet_plane_device::pio1_pb_w) void cedar_magnet_plane_device::pio1_pb_w(u8 data)
{ {
m_scrolly = data; m_scrolly = data;
} }
void cedar_magnet_plane_device::device_start() void cedar_magnet_plane_device::device_start()
{ {
save_item(NAME(m_framebuffer)); m_framebuffer = make_unique_clear<u8[]>(0x10000);
save_pointer(NAME(m_framebuffer), 0x10000);
} }
uint32_t cedar_magnet_plane_device::draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int palbase) u32 cedar_magnet_plane_device::draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int palbase)
{ {
int count = 0; int count = 0;
if (!(m_pio0_pa_data & 0x40)) if (!(m_pio0_pa_data & 0x40))
return 0; return 0;
for (int y = 0;y < 256;y++) for (int y = 0; y < 256;y++)
{ {
uint16_t *dst = &bitmap.pix16((y-m_scrolly)&0xff); u16 *dst = &bitmap.pix16((y - m_scrolly) & 0xff);
for (int x = 0; x < 256;x++) for (int x = 0; x < 256;x++)
{ {
uint8_t pix = m_framebuffer[count]; u8 pix = m_framebuffer[count];
count++; count++;
if (pix) dst[(x-m_scrollx)&0xff] = pix + palbase*0x100; if (pix) dst[(x - m_scrollx) & 0xff] = pix + palbase * 0x100;
} }
} }

View File

@ -15,16 +15,16 @@ class cedar_magnet_plane_device : public device_t, public cedar_magnet_board_int
{ {
public: public:
// construction/destruction // construction/destruction
cedar_magnet_plane_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); cedar_magnet_plane_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
DECLARE_WRITE8_MEMBER(plane_portcc_w); void plane_portcc_w(u8 data);
DECLARE_WRITE8_MEMBER(plane_portcd_w); void plane_portcd_w(u8 data);
DECLARE_WRITE8_MEMBER(plane_portce_w); void plane_portce_w(u8 data);
DECLARE_WRITE8_MEMBER(plane_portcf_w); void plane_portcf_w(u8 data);
INTERRUPT_GEN_MEMBER(vblank_irq); INTERRUPT_GEN_MEMBER(vblank_irq);
uint32_t draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int palbase); u32 draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int palbase);
void cedar_magnet_plane_io(address_map &map); void cedar_magnet_plane_io(address_map &map);
void cedar_magnet_plane_map(address_map &map); void cedar_magnet_plane_map(address_map &map);
@ -33,28 +33,28 @@ protected:
virtual void device_start() override; virtual void device_start() override;
private: private:
uint8_t m_framebuffer[0x10000]; std::unique_ptr<u8[]> m_framebuffer;
int m_curline; int m_curline;
int m_lineoffset; int m_lineoffset;
uint8_t m_pio0_pa_data; u8 m_pio0_pa_data;
uint8_t m_pio0_pb_data; u8 m_pio0_pb_data;
uint8_t m_scrollx; u8 m_scrollx;
uint8_t m_scrolly; u8 m_scrolly;
int m_direction; int m_direction;
uint8_t m_cd_data; u8 m_cd_data;
uint8_t m_cf_data; u8 m_cf_data;
DECLARE_READ8_MEMBER(pio0_pa_r); u8 pio0_pa_r();
DECLARE_WRITE8_MEMBER(pio0_pa_w); void pio0_pa_w(u8 data);
// DECLARE_READ8_MEMBER(pio0_pb_r); // DECLARE_READ8_MEMBER(pio0_pb_r);
DECLARE_WRITE8_MEMBER(pio0_pb_w); void pio0_pb_w(u8 data);
// DECLARE_READ8_MEMBER(pio1_pa_r); // DECLARE_READ8_MEMBER(pio1_pa_r);
DECLARE_WRITE8_MEMBER(pio1_pa_w); void pio1_pa_w(u8 data);
// DECLARE_READ8_MEMBER(pio1_pb_r); // DECLARE_READ8_MEMBER(pio1_pb_r);
DECLARE_WRITE8_MEMBER(pio1_pb_w); void pio1_pb_w(u8 data);
}; };
#endif // MAME_MACHINE_CEDAR_MAGNET_PLANE_H #endif // MAME_MACHINE_CEDAR_MAGNET_PLANE_H

View File

@ -13,13 +13,11 @@
DEFINE_DEVICE_TYPE(CEDAR_MAGNET_SPRITE, cedar_magnet_sprite_device, "cedmag_sprite", "Cedar Sprite") DEFINE_DEVICE_TYPE(CEDAR_MAGNET_SPRITE, cedar_magnet_sprite_device, "cedmag_sprite", "Cedar Sprite")
cedar_magnet_sprite_device::cedar_magnet_sprite_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) cedar_magnet_sprite_device::cedar_magnet_sprite_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, CEDAR_MAGNET_SPRITE, tag, owner, clock), : device_t(mconfig, CEDAR_MAGNET_SPRITE, tag, owner, clock)
cedar_magnet_board_interface(mconfig, *this, "spritecpu", "ram"), , cedar_magnet_board_interface(mconfig, *this, "spritecpu", "ram")
m_sprite_ram_bankdev(*this, "sp_sub_ram"), , m_sprite_ram_bankdev(*this, "sp_sub_ram")
m_pio0(*this, "z80pio0"), , m_pio(*this, "z80pio%u", 0U)
m_pio1(*this, "z80pio1"),
m_pio2(*this, "z80pio2")
{ {
} }
@ -30,7 +28,7 @@ void cedar_magnet_sprite_device::cedar_magnet_sprite_sub_ram_map(address_map &ma
map(0x00000, 0x3ffff).ram().share("ram"); map(0x00000, 0x3ffff).ram().share("ram");
} }
READ8_MEMBER(cedar_magnet_sprite_device::exzisus_hack_r) u8 cedar_magnet_sprite_device::exzisus_hack_r(offs_t offset)
{ {
//printf("exzisus_hack_r\n"); //printf("exzisus_hack_r\n");
int pc = m_cpu->pc(); int pc = m_cpu->pc();
@ -43,7 +41,7 @@ READ8_MEMBER(cedar_magnet_sprite_device::exzisus_hack_r)
} }
else else
{ {
return m_ram[0x400 + offset + (pio2_pb_data & 0x3)*0x10000]; return m_ram[0x400 + offset + (m_pio2_pb_data & 0x3) * 0x10000];
} }
} }
@ -78,7 +76,7 @@ void cedar_magnet_sprite_device::cedar_magnet_sprite_io(address_map &map)
void cedar_magnet_sprite_device::do_blit() void cedar_magnet_sprite_device::do_blit()
{ {
// printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); // printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
// printf("~~~~~~~~~~~~~~~~~ drawing sprite with x:%02x y:%02x code:%04x size:%02x unk:%02x\n", m_loweraddr, m_upperaddr, (m_spritecodehigh << 8) | m_spritecodelow, m_spritesize, pio0_pb_data); // printf("~~~~~~~~~~~~~~~~~ drawing sprite with x:%02x y:%02x code:%04x size:%02x unk:%02x\n", m_loweraddr, m_upperaddr, (m_spritecodehigh << 8) | m_spritecodelow, m_spritesize, m_pio0_pb_data);
// printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); // printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
int ysize = 0; int ysize = 0;
@ -99,8 +97,7 @@ void cedar_magnet_sprite_device::do_blit()
ysize = xsize = 64; ysize = xsize = 64;
// m_spritesize // m_spritesize
// pio0_pb_data // m_pio0_pb_data
int source = (m_spritecodehigh << 8) | m_spritecodelow; int source = (m_spritecodehigh << 8) | m_spritecodelow;
@ -109,16 +106,16 @@ void cedar_magnet_sprite_device::do_blit()
source &= ~0x3f; source &= ~0x3f;
for (int y = 0;y < ysize;y++) for (int y = 0; y < ysize; y++)
{ {
for (int x = 0;x < xsize;x++) for (int x = 0; x < xsize; x++)
{ {
int xpos = (m_loweraddr + x); int xpos = (m_loweraddr + x);
int ypos = (m_upperaddr + y); int ypos = (m_upperaddr + y);
uint8_t data = m_ram[source + ((m_uppersprite & 0x3) * 0x10000)]; u8 data = m_ram[source + ((m_uppersprite & 0x3) * 0x10000)];
if (!(pio0_pb_data & 0x02)) if (!(m_pio0_pb_data & 0x02))
data = machine().rand(); data = machine().rand();
source++; source++;
@ -128,7 +125,7 @@ void cedar_magnet_sprite_device::do_blit()
// without this some sprites incorrectly wraparound on the volcano table. // without this some sprites incorrectly wraparound on the volcano table.
if (!erase) if (!erase)
{ {
if (!(pio0_pb_data & 0x40)) if (!(m_pio0_pb_data & 0x40))
{ {
if (xpos >= 0xff-64) if (xpos >= 0xff-64)
continue; continue;
@ -159,7 +156,7 @@ void cedar_magnet_sprite_device::do_blit()
} }
} }
WRITE8_MEMBER(cedar_magnet_sprite_device::sprite_port80_w) void cedar_magnet_sprite_device::sprite_port80_w(u8 data)
{ {
m_spritecodelow = data; m_spritecodelow = data;
// printf("%s:sprite numlow / trigger %02x\n", machine().describe_context().c_str(), data); // printf("%s:sprite numlow / trigger %02x\n", machine().describe_context().c_str(), data);
@ -167,28 +164,28 @@ WRITE8_MEMBER(cedar_magnet_sprite_device::sprite_port80_w)
do_blit(); do_blit();
} }
WRITE8_MEMBER(cedar_magnet_sprite_device::sprite_port84_w) void cedar_magnet_sprite_device::sprite_port84_w(u8 data)
{ {
m_spritecodehigh = data; m_spritecodehigh = data;
m_high_write = 1; m_high_write = 1;
// printf("%s:sprite numhigh %02x\n", machine().describe_context().c_str(), data); // printf("%s:sprite numhigh %02x\n", machine().describe_context().c_str(), data);
} }
WRITE8_MEMBER(cedar_magnet_sprite_device::sprite_port88_w) void cedar_magnet_sprite_device::sprite_port88_w(u8 data)
{ {
// frequent // frequent
// printf("%s:sprite_y_coordinate %02x\n", machine().describe_context().c_str(), data); // printf("%s:sprite_y_coordinate %02x\n", machine().describe_context().c_str(), data);
m_upperaddr = data; m_upperaddr = data;
} }
WRITE8_MEMBER(cedar_magnet_sprite_device::pio2_pa_w) void cedar_magnet_sprite_device::pio2_pa_w(u8 data)
{ {
// frequent // frequent
// printf("%s:sprite_x_coordinate %02x\n", machine().describe_context().c_str(), data); // printf("%s:sprite_x_coordinate %02x\n", machine().describe_context().c_str(), data);
m_loweraddr = data; m_loweraddr = data;
} }
WRITE8_MEMBER(cedar_magnet_sprite_device::sprite_port8c_w) void cedar_magnet_sprite_device::sprite_port8c_w(u8 data)
{ {
int address = (m_upperaddr << 8) | m_loweraddr; int address = (m_upperaddr << 8) | m_loweraddr;
m_framebuffer[address] = data; m_framebuffer[address] = data;
@ -196,7 +193,7 @@ WRITE8_MEMBER(cedar_magnet_sprite_device::sprite_port8c_w)
} }
// possible watchdog? // possible watchdog?
WRITE8_MEMBER(cedar_magnet_sprite_device::sprite_port9c_w) void cedar_magnet_sprite_device::sprite_port9c_w(u8 data)
{ {
// printf("%s:sprite_port9c_w %02x\n", machine().describe_context().c_str(), data); // printf("%s:sprite_port9c_w %02x\n", machine().describe_context().c_str(), data);
} }
@ -207,33 +204,33 @@ void cedar_magnet_sprite_device::device_add_mconfig(machine_config &config)
spritecpu.set_addrmap(AS_PROGRAM, &cedar_magnet_sprite_device::cedar_magnet_sprite_map); spritecpu.set_addrmap(AS_PROGRAM, &cedar_magnet_sprite_device::cedar_magnet_sprite_map);
spritecpu.set_addrmap(AS_IO, &cedar_magnet_sprite_device::cedar_magnet_sprite_io); spritecpu.set_addrmap(AS_IO, &cedar_magnet_sprite_device::cedar_magnet_sprite_io);
Z80PIO(config, m_pio0, 4000000/2); Z80PIO(config, m_pio[0], 4000000/2);
// m_pio0->out_int_callback().set_inputline("maincpu", INPUT_LINE_IRQ0); // m_pio[0]->out_int_callback().set_inputline("maincpu", INPUT_LINE_IRQ0);
m_pio0->in_pa_callback().set(FUNC(cedar_magnet_sprite_device::pio0_pa_r)); m_pio[0]->in_pa_callback().set(FUNC(cedar_magnet_sprite_device::pio0_pa_r));
m_pio0->out_pa_callback().set(FUNC(cedar_magnet_sprite_device::pio0_pa_w)); m_pio[0]->out_pa_callback().set(FUNC(cedar_magnet_sprite_device::pio0_pa_w));
// m_pio0->in_pb_callback().set(FUNC(cedar_magnet_sprite_device::pio0_pb_r)); // m_pio[0]->in_pb_callback().set(FUNC(cedar_magnet_sprite_device::pio0_pb_r));
m_pio0->out_pb_callback().set(FUNC(cedar_magnet_sprite_device::pio0_pb_w)); m_pio[0]->out_pb_callback().set(FUNC(cedar_magnet_sprite_device::pio0_pb_w));
Z80PIO(config, m_pio1, 4000000/2); Z80PIO(config, m_pio[1], 4000000/2);
// m_pio1->out_int_callback().set_inputline("maincpu", INPUT_LINE_IRQ0); // m_pio[1]->out_int_callback().set_inputline("maincpu", INPUT_LINE_IRQ0);
// m_pio1->in_pa_callback().set(FUNC(cedar_magnet_sprite_device::pio1_pa_r)); // m_pio[1]->in_pa_callback().set(FUNC(cedar_magnet_sprite_device::pio1_pa_r));
m_pio1->out_pa_callback().set(FUNC(cedar_magnet_sprite_device::pio1_pa_w)); m_pio[1]->out_pa_callback().set(FUNC(cedar_magnet_sprite_device::pio1_pa_w));
// m_pio1->in_pb_callback().set(FUNC(cedar_magnet_sprite_device::pio1_pb_r)); // m_pio[1]->in_pb_callback().set(FUNC(cedar_magnet_sprite_device::pio1_pb_r));
m_pio1->out_pb_callback().set(FUNC(cedar_magnet_sprite_device::pio1_pb_w)); m_pio[1]->out_pb_callback().set(FUNC(cedar_magnet_sprite_device::pio1_pb_w));
Z80PIO(config, m_pio2, 4000000/2); Z80PIO(config, m_pio[2], 4000000/2);
// m_pio2->out_int_callback().set_inputline("maincpu", INPUT_LINE_IRQ0); // m_pio[2]->out_int_callback().set_inputline("maincpu", INPUT_LINE_IRQ0);
// m_pio2->in_pa_callback().set(FUNC(cedar_magnet_sprite_device::pio2_pa_r)); // m_pio[2]->in_pa_callback().set(FUNC(cedar_magnet_sprite_device::pio2_pa_r));
m_pio2->out_pa_callback().set(FUNC(cedar_magnet_sprite_device::pio2_pa_w)); m_pio[2]->out_pa_callback().set(FUNC(cedar_magnet_sprite_device::pio2_pa_w));
// m_pio2->in_pb_callback().set(FUNC(cedar_magnet_sprite_device::pio2_pb_r)); // m_pio[2]->in_pb_callback().set(FUNC(cedar_magnet_sprite_device::pio2_pb_r));
m_pio2->out_pb_callback().set(FUNC(cedar_magnet_sprite_device::pio2_pb_w)); m_pio[2]->out_pb_callback().set(FUNC(cedar_magnet_sprite_device::pio2_pb_w));
ADDRESS_MAP_BANK(config, m_sprite_ram_bankdev).set_map(&cedar_magnet_sprite_device::cedar_magnet_sprite_sub_ram_map).set_options(ENDIANNESS_LITTLE, 8, 18, 0x10000); ADDRESS_MAP_BANK(config, m_sprite_ram_bankdev).set_map(&cedar_magnet_sprite_device::cedar_magnet_sprite_sub_ram_map).set_options(ENDIANNESS_LITTLE, 8, 18, 0x10000);
} }
READ8_MEMBER(cedar_magnet_sprite_device::pio0_pa_r) u8 cedar_magnet_sprite_device::pio0_pa_r()
{ {
// actually read // actually read
// printf("%s: pio0_pa_r\n", machine().describe_context().c_str()); // printf("%s: pio0_pa_r\n", machine().describe_context().c_str());
@ -241,30 +238,29 @@ READ8_MEMBER(cedar_magnet_sprite_device::pio0_pa_r)
} }
void cedar_magnet_sprite_device::pio0_pa_w(u8 data)
WRITE8_MEMBER(cedar_magnet_sprite_device::pio0_pa_w)
{ {
m_spritesize = data; m_spritesize = data;
} }
WRITE8_MEMBER(cedar_magnet_sprite_device::pio0_pb_w) void cedar_magnet_sprite_device::pio0_pb_w(u8 data)
{ {
pio0_pb_data = data; m_pio0_pb_data = data;
//printf("%s: pio0_pb_w %02x\n", machine().describe_context().c_str(), data); //printf("%s: pio0_pb_w %02x\n", machine().describe_context().c_str(), data);
} }
WRITE8_MEMBER(cedar_magnet_sprite_device::pio1_pa_w) void cedar_magnet_sprite_device::pio1_pa_w(u8 data)
{ {
//printf("%s: pio1_pa_w %02x\n", machine().describe_context().c_str(), data); //printf("%s: pio1_pa_w %02x\n", machine().describe_context().c_str(), data);
} }
WRITE8_MEMBER(cedar_magnet_sprite_device::pio1_pb_w) void cedar_magnet_sprite_device::pio1_pb_w(u8 data)
{ {
//printf("%s: pio1_pb_w %02x\n", machine().describe_context().c_str(), data); //printf("%s: pio1_pb_w %02x\n", machine().describe_context().c_str(), data);
} }
WRITE8_MEMBER(cedar_magnet_sprite_device::pio2_pb_w) void cedar_magnet_sprite_device::pio2_pb_w(u8 data)
{ {
// this feels like a hack // this feels like a hack
// the game writes here when creating the sprite list so that it can access the correct gfd data // the game writes here when creating the sprite list so that it can access the correct gfd data
@ -277,7 +273,7 @@ WRITE8_MEMBER(cedar_magnet_sprite_device::pio2_pb_w)
} }
pio2_pb_data = data; m_pio2_pb_data = data;
//printf("%s: ******************************************* BANK? **** pio2_pb_w %02x\n", machine().describe_context().c_str(), data); //printf("%s: ******************************************* BANK? **** pio2_pb_w %02x\n", machine().describe_context().c_str(), data);
// yes, it ends up banking the ram right out from under itself during startup execution... // yes, it ends up banking the ram right out from under itself during startup execution...
// during this time the main cpu is waiting in a loop, after which it copies the startup code again, and reboots it. // during this time the main cpu is waiting in a loop, after which it copies the startup code again, and reboots it.
@ -287,6 +283,8 @@ WRITE8_MEMBER(cedar_magnet_sprite_device::pio2_pb_w)
void cedar_magnet_sprite_device::device_start() void cedar_magnet_sprite_device::device_start()
{ {
m_framebuffer = make_unique_clear<u8[]>(0x10000);
save_pointer(NAME(m_framebuffer), 0x10000);
} }
@ -294,32 +292,31 @@ void cedar_magnet_sprite_device::device_reset()
{ {
halt_assert(); halt_assert();
m_sprite_ram_bankdev->set_bank(0); m_sprite_ram_bankdev->set_bank(0);
pio2_pb_data = 0x00; m_pio2_pb_data = 0x00;
m_spritesize = 0xff; m_spritesize = 0xff;
} }
uint32_t cedar_magnet_sprite_device::draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int palbase) u32 cedar_magnet_sprite_device::draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int palbase)
{ {
// printf("-----------------------------------------------------------------------------------------------------------\n"); // printf("-----------------------------------------------------------------------------------------------------------\n");
// printf("--------------------------------------------- FRAME -------------------------------------------------------\n"); // printf("--------------------------------------------- FRAME -------------------------------------------------------\n");
// printf("-----------------------------------------------------------------------------------------------------------\n"); // printf("-----------------------------------------------------------------------------------------------------------\n");
uint8_t* mem = m_framebuffer;
int count = 0; int count = 0;
// if (!(m_m_spritesize & 0x40)) // if (!(m_m_spritesize & 0x40))
// return 0; // return 0;
for (int y = 0;y < 256;y++) for (int y = 0; y < 256; y++)
{ {
uint16_t *dst = &bitmap.pix16((y)&0xff); uint16_t *dst = &bitmap.pix16((y) & 0xff);
for (int x = 0; x < 256;x++) for (int x = 0; x < 256; x++)
{ {
uint8_t pix = mem[count]; u8 pix = m_framebuffer[count];
count++; count++;
if (pix) dst[(x)&0xff] = pix + palbase*0x100; if (pix) dst[(x) & 0xff] = pix + palbase * 0x100;
} }
} }

View File

@ -18,19 +18,19 @@ class cedar_magnet_sprite_device : public device_t, public cedar_magnet_board_in
{ {
public: public:
// construction/destruction // construction/destruction
cedar_magnet_sprite_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); cedar_magnet_sprite_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
DECLARE_WRITE8_MEMBER(sprite_port80_w); void sprite_port80_w(u8 data);
DECLARE_WRITE8_MEMBER(sprite_port84_w); void sprite_port84_w(u8 data);
DECLARE_WRITE8_MEMBER(sprite_port88_w); void sprite_port88_w(u8 data);
DECLARE_WRITE8_MEMBER(sprite_port8c_w); void sprite_port8c_w(u8 data);
DECLARE_WRITE8_MEMBER(sprite_port9c_w); void sprite_port9c_w(u8 data);
DECLARE_READ8_MEMBER(exzisus_hack_r); u8 exzisus_hack_r(offs_t offset);
INTERRUPT_GEN_MEMBER(irq); INTERRUPT_GEN_MEMBER(irq);
uint32_t draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int palbase); u32 draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int palbase);
void cedar_magnet_sprite_io(address_map &map); void cedar_magnet_sprite_io(address_map &map);
void cedar_magnet_sprite_map(address_map &map); void cedar_magnet_sprite_map(address_map &map);
@ -43,40 +43,38 @@ protected:
private: private:
void do_blit(); void do_blit();
uint8_t m_framebuffer[0x10000]; std::unique_ptr<u8[]> m_framebuffer;
uint8_t pio2_pb_data; u8 m_pio2_pb_data;
required_device<address_map_bank_device> m_sprite_ram_bankdev; required_device<address_map_bank_device> m_sprite_ram_bankdev;
uint8_t m_upperaddr; u8 m_upperaddr;
uint8_t m_loweraddr; u8 m_loweraddr;
uint8_t m_spritesize; u8 m_spritesize;
uint8_t pio0_pb_data; u8 m_pio0_pb_data;
uint8_t m_spritecodelow; u8 m_spritecodelow;
uint8_t m_spritecodehigh; u8 m_spritecodehigh;
int m_high_write; int m_high_write;
uint8_t m_uppersprite; u8 m_uppersprite;
DECLARE_READ8_MEMBER(pio0_pa_r); u8 pio0_pa_r();
DECLARE_WRITE8_MEMBER(pio0_pa_w); void pio0_pa_w(u8 data);
// DECLARE_READ8_MEMBER(pio0_pb_r); // DECLARE_READ8_MEMBER(pio0_pb_r);
DECLARE_WRITE8_MEMBER(pio0_pb_w); void pio0_pb_w(u8 data);
// DECLARE_READ8_MEMBER(pio1_pa_r); // DECLARE_READ8_MEMBER(pio1_pa_r);
DECLARE_WRITE8_MEMBER(pio1_pa_w); void pio1_pa_w(u8 data);
// DECLARE_READ8_MEMBER(pio1_pb_r); // DECLARE_READ8_MEMBER(pio1_pb_r);
DECLARE_WRITE8_MEMBER(pio1_pb_w); void pio1_pb_w(u8 data);
// DECLARE_READ8_MEMBER(pio2_pa_r); // DECLARE_READ8_MEMBER(pio2_pa_r);
DECLARE_WRITE8_MEMBER(pio2_pa_w); void pio2_pa_w(u8 data);
// DECLARE_READ8_MEMBER(pio2_pb_r); // DECLARE_READ8_MEMBER(pio2_pb_r);
DECLARE_WRITE8_MEMBER(pio2_pb_w); void pio2_pb_w(u8 data);
required_device<z80pio_device> m_pio0; required_device_array<z80pio_device, 3> m_pio;
required_device<z80pio_device> m_pio1;
required_device<z80pio_device> m_pio2;
}; };
#endif // MAME_MACHINE_CEDAR_MAGNET_SPRITE_H #endif // MAME_MACHINE_CEDAR_MAGNET_SPRITE_H