mirror of
https://github.com/holub/mame
synced 2025-06-30 16:00:01 +03:00
Machines promoted to working
---------------------------- Craft [Ryan Holtz]
This commit is contained in:
parent
cdd9768e30
commit
c8d49702f0
@ -4,22 +4,15 @@
|
|||||||
|
|
||||||
"Craft" demo platform by Linus Akesson
|
"Craft" demo platform by Linus Akesson
|
||||||
|
|
||||||
driver by Ryan Holtz
|
|
||||||
|
|
||||||
**********************************************************************/
|
**********************************************************************/
|
||||||
|
|
||||||
#include "emu.h"
|
#include "emu.h"
|
||||||
#include "cpu/avr8/avr8.h"
|
#include "cpu/avr8/avr8.h"
|
||||||
#include "sound/dac.h"
|
#include "sound/dac.h"
|
||||||
#include "sound/volt_reg.h"
|
#include "sound/volt_reg.h"
|
||||||
#include "emupal.h"
|
|
||||||
#include "screen.h"
|
#include "screen.h"
|
||||||
#include "speaker.h"
|
#include "speaker.h"
|
||||||
|
|
||||||
#define VERBOSE_LEVEL (0)
|
|
||||||
|
|
||||||
#define ENABLE_VERBOSE_LOG (0)
|
|
||||||
|
|
||||||
#define MASTER_CLOCK 20000000
|
#define MASTER_CLOCK 20000000
|
||||||
|
|
||||||
#define VISIBLE_CYCLES 480
|
#define VISIBLE_CYCLES 480
|
||||||
@ -31,23 +24,34 @@
|
|||||||
#define CYCLES_PER_FRAME (LINES_PER_FRAME * LINE_CYCLES)
|
#define CYCLES_PER_FRAME (LINES_PER_FRAME * LINE_CYCLES)
|
||||||
#define PIXELS_PER_FRAME (CYCLES_PER_FRAME)
|
#define PIXELS_PER_FRAME (CYCLES_PER_FRAME)
|
||||||
|
|
||||||
/****************************************************\
|
|
||||||
* I/O devices *
|
|
||||||
\****************************************************/
|
|
||||||
|
|
||||||
class craft_state : public driver_device
|
class craft_state : public driver_device
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
craft_state(const machine_config &mconfig, device_type type, const char *tag)
|
craft_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||||
: driver_device(mconfig, type, tag),
|
: driver_device(mconfig, type, tag)
|
||||||
m_maincpu(*this, "maincpu"),
|
, m_maincpu(*this, "maincpu")
|
||||||
m_dac(*this, "dac")
|
, m_dac(*this, "dac")
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void video_update();
|
void craft(machine_config &config);
|
||||||
|
|
||||||
|
private:
|
||||||
virtual void machine_start() override;
|
virtual void machine_start() override;
|
||||||
|
virtual void machine_reset() override;
|
||||||
|
|
||||||
|
void craft_prg_map(address_map &map);
|
||||||
|
void craft_data_map(address_map &map);
|
||||||
|
void craft_io_map(address_map &map);
|
||||||
|
|
||||||
|
DECLARE_READ8_MEMBER(port_r);
|
||||||
|
DECLARE_WRITE8_MEMBER(port_w);
|
||||||
|
|
||||||
|
void video_update();
|
||||||
|
uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||||
|
|
||||||
|
required_device<avr8_device> m_maincpu;
|
||||||
|
required_device<dac_byte_interface> m_dac;
|
||||||
|
|
||||||
uint32_t m_last_cycles;
|
uint32_t m_last_cycles;
|
||||||
uint64_t m_frame_start_cycle;
|
uint64_t m_frame_start_cycle;
|
||||||
@ -57,52 +61,25 @@ public:
|
|||||||
uint8_t m_port_d;
|
uint8_t m_port_d;
|
||||||
|
|
||||||
uint8_t m_latched_color;
|
uint8_t m_latched_color;
|
||||||
uint8_t m_pixels[PIXELS_PER_FRAME];
|
std::unique_ptr<uint8_t[]> m_pixels;
|
||||||
|
|
||||||
required_device<avr8_device> m_maincpu;
|
|
||||||
|
|
||||||
DECLARE_READ8_MEMBER(port_r);
|
|
||||||
DECLARE_WRITE8_MEMBER(port_w);
|
|
||||||
void init_craft();
|
|
||||||
virtual void machine_reset() override;
|
|
||||||
uint32_t screen_update_craft(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
|
||||||
inline void verboselog(int n_level, const char *s_fmt, ...) ATTR_PRINTF(3,4);
|
|
||||||
required_device<dac_byte_interface> m_dac;
|
|
||||||
void craft(machine_config &config);
|
|
||||||
void craft_data_map(address_map &map);
|
|
||||||
void craft_io_map(address_map &map);
|
|
||||||
void craft_prg_map(address_map &map);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
inline void craft_state::verboselog(int n_level, const char *s_fmt, ...)
|
//**************************************************************************
|
||||||
{
|
// GPIO
|
||||||
#if ENABLE_VERBOSE_LOG
|
//**************************************************************************
|
||||||
if( VERBOSE_LEVEL >= n_level )
|
|
||||||
{
|
|
||||||
va_list v;
|
|
||||||
char buf[ 32768 ];
|
|
||||||
va_start( v, s_fmt );
|
|
||||||
vsprintf( buf, s_fmt, v );
|
|
||||||
va_end( v );
|
|
||||||
logerror( "%s: %s", machine().describe_context(), buf );
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void craft_state::machine_start()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
READ8_MEMBER(craft_state::port_r)
|
READ8_MEMBER(craft_state::port_r)
|
||||||
{
|
{
|
||||||
switch (offset)
|
switch (offset)
|
||||||
{
|
{
|
||||||
case 0x00: // Port A
|
case 0x00: // Port A
|
||||||
|
break;
|
||||||
case 0x01: // Port B
|
case 0x01: // Port B
|
||||||
|
return m_port_b;
|
||||||
case 0x02: // Port C
|
case 0x02: // Port C
|
||||||
|
return m_port_c;
|
||||||
case 0x03: // Port D
|
case 0x03: // Port D
|
||||||
// Unhandled
|
return m_port_d;
|
||||||
return 0x00;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -112,21 +89,23 @@ WRITE8_MEMBER(craft_state::port_w)
|
|||||||
{
|
{
|
||||||
switch (offset)
|
switch (offset)
|
||||||
{
|
{
|
||||||
case AVR8_IO_PORTA: // Port A
|
case AVR8_IO_PORTA:
|
||||||
// Unhandled
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AVR8_IO_PORTB: // Port B
|
case AVR8_IO_PORTB:
|
||||||
{
|
{
|
||||||
uint8_t old_port_b = m_port_b;
|
uint8_t old_port_b = m_port_b;
|
||||||
uint8_t pins = data;
|
uint8_t pins = data;
|
||||||
uint8_t changed = pins ^ old_port_b;
|
uint8_t changed = pins ^ old_port_b;
|
||||||
if(pins & changed & 0x02)
|
if (BIT(changed, 1))
|
||||||
|
{
|
||||||
|
video_update();
|
||||||
|
if (BIT(pins, 1))
|
||||||
{
|
{
|
||||||
m_frame_start_cycle = m_maincpu->get_elapsed_cycles();
|
m_frame_start_cycle = m_maincpu->get_elapsed_cycles();
|
||||||
video_update();
|
|
||||||
}
|
}
|
||||||
if(changed & 0x08)
|
}
|
||||||
|
if (BIT(changed, 3))
|
||||||
{
|
{
|
||||||
video_update();
|
video_update();
|
||||||
m_latched_color = (pins & 0x08) ? (m_port_c & 0x3f) : 0x3f;
|
m_latched_color = (pins & 0x08) ? (m_port_c & 0x3f) : 0x3f;
|
||||||
@ -135,22 +114,42 @@ WRITE8_MEMBER(craft_state::port_w)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case AVR8_IO_PORTC: // Port C
|
case AVR8_IO_PORTC:
|
||||||
video_update();
|
video_update();
|
||||||
m_port_c = data;
|
m_port_c = data;
|
||||||
m_latched_color = m_port_c;
|
m_latched_color = m_port_c;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AVR8_IO_PORTD: // Port D
|
case AVR8_IO_PORTD:
|
||||||
{
|
|
||||||
m_port_d = data;
|
m_port_d = data;
|
||||||
uint8_t audio_sample = (data & 0x02) | ((data & 0xf4) >> 2);
|
m_dac->write((data & 0x02) | ((data & 0xf4) >> 2));
|
||||||
m_dac->write(audio_sample);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//**************************************************************************
|
||||||
|
// MEMORY
|
||||||
|
//**************************************************************************
|
||||||
|
|
||||||
|
void craft_state::craft_prg_map(address_map &map)
|
||||||
|
{
|
||||||
|
map(0x0000, 0x1fff).rom();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void craft_state::craft_data_map(address_map &map)
|
||||||
|
{
|
||||||
|
map(0x0100, 0x04ff).ram();
|
||||||
|
}
|
||||||
|
|
||||||
|
void craft_state::craft_io_map(address_map &map)
|
||||||
|
{
|
||||||
|
map(AVR8_IO_PORTA, AVR8_IO_PORTD).rw(FUNC(craft_state::port_r), FUNC(craft_state::port_w));
|
||||||
|
}
|
||||||
|
|
||||||
|
//**************************************************************************
|
||||||
|
// VIDEO
|
||||||
|
//**************************************************************************
|
||||||
|
|
||||||
void craft_state::video_update()
|
void craft_state::video_update()
|
||||||
{
|
{
|
||||||
uint64_t cycles = m_maincpu->get_elapsed_cycles();
|
uint64_t cycles = m_maincpu->get_elapsed_cycles();
|
||||||
@ -171,50 +170,18 @@ void craft_state::video_update()
|
|||||||
start_clear = (start_clear > PIXELS_PER_FRAME) ? PIXELS_PER_FRAME : start_clear;
|
start_clear = (start_clear > PIXELS_PER_FRAME) ? PIXELS_PER_FRAME : start_clear;
|
||||||
if (m_last_cycles < PIXELS_PER_FRAME)
|
if (m_last_cycles < PIXELS_PER_FRAME)
|
||||||
{
|
{
|
||||||
memset(m_pixels + m_last_cycles, 0, end_clear);
|
//memset(&m_pixels[0] + m_last_cycles, 0, end_clear);
|
||||||
}
|
}
|
||||||
if (start_clear < PIXELS_PER_FRAME)
|
if (start_clear < PIXELS_PER_FRAME)
|
||||||
{
|
{
|
||||||
memset(m_pixels, 0, start_clear);
|
//memset(&m_pixels[0], 0, start_clear);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_last_cycles = frame_cycles;
|
m_last_cycles = frame_cycles;
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************\
|
uint32_t craft_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
||||||
* Address maps *
|
|
||||||
\****************************************************/
|
|
||||||
|
|
||||||
void craft_state::craft_prg_map(address_map &map)
|
|
||||||
{
|
|
||||||
map(0x0000, 0x1fff).rom();
|
|
||||||
}
|
|
||||||
|
|
||||||
void craft_state::craft_data_map(address_map &map)
|
|
||||||
{
|
|
||||||
map(0x0100, 0x04ff).ram();
|
|
||||||
}
|
|
||||||
|
|
||||||
void craft_state::craft_io_map(address_map &map)
|
|
||||||
{
|
|
||||||
map(AVR8_IO_PORTA, AVR8_IO_PORTD).rw(FUNC(craft_state::port_r), FUNC(craft_state::port_w));
|
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************\
|
|
||||||
* Input ports *
|
|
||||||
\****************************************************/
|
|
||||||
|
|
||||||
static INPUT_PORTS_START( craft )
|
|
||||||
PORT_START("MAIN")
|
|
||||||
PORT_BIT(0xff, IP_ACTIVE_HIGH, IPT_UNUSED)
|
|
||||||
INPUT_PORTS_END
|
|
||||||
|
|
||||||
/****************************************************\
|
|
||||||
* Video hardware *
|
|
||||||
\****************************************************/
|
|
||||||
|
|
||||||
uint32_t craft_state::screen_update_craft(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
|
||||||
{
|
{
|
||||||
for(int y = 0; y < LINES_PER_FRAME; y++)
|
for(int y = 0; y < LINES_PER_FRAME; y++)
|
||||||
{
|
{
|
||||||
@ -231,18 +198,39 @@ uint32_t craft_state::screen_update_craft(screen_device &screen, bitmap_rgb32 &b
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************\
|
//**************************************************************************
|
||||||
* Machine definition *
|
// MACHINE
|
||||||
\****************************************************/
|
//**************************************************************************
|
||||||
|
|
||||||
void craft_state::init_craft()
|
static INPUT_PORTS_START( craft )
|
||||||
|
INPUT_PORTS_END
|
||||||
|
|
||||||
|
void craft_state::machine_start()
|
||||||
{
|
{
|
||||||
|
m_pixels = std::make_unique<uint8_t[]>(PIXELS_PER_FRAME);
|
||||||
|
|
||||||
|
save_item(NAME(m_last_cycles));
|
||||||
|
save_item(NAME(m_frame_start_cycle));
|
||||||
|
|
||||||
|
save_item(NAME(m_port_b));
|
||||||
|
save_item(NAME(m_port_c));
|
||||||
|
save_item(NAME(m_port_d));
|
||||||
|
|
||||||
|
save_item(NAME(m_latched_color));
|
||||||
|
save_pointer(NAME(m_pixels), PIXELS_PER_FRAME);
|
||||||
}
|
}
|
||||||
|
|
||||||
void craft_state::machine_reset()
|
void craft_state::machine_reset()
|
||||||
{
|
{
|
||||||
m_frame_start_cycle = 0;
|
m_frame_start_cycle = 0;
|
||||||
m_last_cycles = 0;
|
m_last_cycles = 0;
|
||||||
|
|
||||||
|
m_port_b = 0;
|
||||||
|
m_port_c = 0;
|
||||||
|
m_port_d = 0;
|
||||||
|
|
||||||
|
m_latched_color = 0;
|
||||||
|
memset(&m_pixels[0], 0, PIXELS_PER_FRAME);
|
||||||
}
|
}
|
||||||
|
|
||||||
void craft_state::craft(machine_config &config)
|
void craft_state::craft(machine_config &config)
|
||||||
@ -256,12 +244,8 @@ void craft_state::craft(machine_config &config)
|
|||||||
|
|
||||||
/* video hardware */
|
/* video hardware */
|
||||||
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
|
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
|
||||||
screen.set_refresh_hz(59.99);
|
screen.set_raw(MASTER_CLOCK, 635, 47, 527, 525, 36, 516);
|
||||||
screen.set_vblank_time(ATTOSECONDS_IN_USEC(1429)); /* accurate */
|
screen.set_screen_update(FUNC(craft_state::screen_update));
|
||||||
screen.set_size(635, 525);
|
|
||||||
screen.set_visarea(47, 526, 36, 515);
|
|
||||||
screen.set_screen_update(FUNC(craft_state::screen_update_craft));
|
|
||||||
PALETTE(config, "palette").set_entries(0x1000);
|
|
||||||
|
|
||||||
/* sound hardware */
|
/* sound hardware */
|
||||||
SPEAKER(config, "avr8").front_center();
|
SPEAKER(config, "avr8").front_center();
|
||||||
@ -279,4 +263,4 @@ ROM_START( craft )
|
|||||||
ROM_END
|
ROM_END
|
||||||
|
|
||||||
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME */
|
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME */
|
||||||
CONS(2008, craft, 0, 0, craft, craft, craft_state, init_craft, "Linus Akesson", "Craft", MACHINE_NOT_WORKING)
|
CONS(2008, craft, 0, 0, craft, craft, craft_state, empty_init, "Linus Akesson", "Craft", MACHINE_IMPERFECT_GRAPHICS)
|
||||||
|
Loading…
Reference in New Issue
Block a user