summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/craft.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/craft.cpp')
-rw-r--r--src/mame/drivers/craft.cpp206
1 files changed, 95 insertions, 111 deletions
diff --git a/src/mame/drivers/craft.cpp b/src/mame/drivers/craft.cpp
index c63a1ca94af..c438c498243 100644
--- a/src/mame/drivers/craft.cpp
+++ b/src/mame/drivers/craft.cpp
@@ -4,22 +4,15 @@
"Craft" demo platform by Linus Akesson
- driver by Ryan Holtz
-
- **********************************************************************/
+**********************************************************************/
#include "emu.h"
#include "cpu/avr8/avr8.h"
#include "sound/dac.h"
#include "sound/volt_reg.h"
-#include "emupal.h"
#include "screen.h"
#include "speaker.h"
-#define VERBOSE_LEVEL (0)
-
-#define ENABLE_VERBOSE_LOG (0)
-
#define MASTER_CLOCK 20000000
#define VISIBLE_CYCLES 480
@@ -31,23 +24,34 @@
#define CYCLES_PER_FRAME (LINES_PER_FRAME * LINE_CYCLES)
#define PIXELS_PER_FRAME (CYCLES_PER_FRAME)
-/****************************************************\
-* I/O devices *
-\****************************************************/
-
class craft_state : public driver_device
{
public:
craft_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu"),
- m_dac(*this, "dac")
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_dac(*this, "dac")
{
}
- void video_update();
+ void craft(machine_config &config);
+private:
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;
uint64_t m_frame_start_cycle;
@@ -57,52 +61,25 @@ public:
uint8_t m_port_d;
uint8_t m_latched_color;
- uint8_t m_pixels[PIXELS_PER_FRAME];
-
- 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);
+ std::unique_ptr<uint8_t[]> m_pixels;
};
-inline void craft_state::verboselog(int n_level, const char *s_fmt, ...)
-{
-#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()
-{
-}
+//**************************************************************************
+// GPIO
+//**************************************************************************
READ8_MEMBER(craft_state::port_r)
{
- switch( offset )
+ switch (offset)
{
case 0x00: // Port A
+ break;
case 0x01: // Port B
+ return m_port_b;
case 0x02: // Port C
+ return m_port_c;
case 0x03: // Port D
- // Unhandled
- return 0x00;
+ return m_port_d;
}
return 0;
@@ -110,23 +87,25 @@ READ8_MEMBER(craft_state::port_r)
WRITE8_MEMBER(craft_state::port_w)
{
- switch( offset )
+ switch (offset)
{
- case AVR8_IO_PORTA: // Port A
- // Unhandled
+ case AVR8_IO_PORTA:
break;
- case AVR8_IO_PORTB: // Port B
+ case AVR8_IO_PORTB:
{
uint8_t old_port_b = m_port_b;
uint8_t pins = data;
uint8_t changed = pins ^ old_port_b;
- if(pins & changed & 0x02)
+ if (BIT(changed, 1))
{
- m_frame_start_cycle = m_maincpu->get_elapsed_cycles();
video_update();
+ if (BIT(pins, 1))
+ {
+ m_frame_start_cycle = m_maincpu->get_elapsed_cycles();
+ }
}
- if(changed & 0x08)
+ if (BIT(changed, 3))
{
video_update();
m_latched_color = (pins & 0x08) ? (m_port_c & 0x3f) : 0x3f;
@@ -135,22 +114,42 @@ WRITE8_MEMBER(craft_state::port_w)
break;
}
- case AVR8_IO_PORTC: // Port C
+ case AVR8_IO_PORTC:
video_update();
m_port_c = data;
m_latched_color = m_port_c;
break;
- case AVR8_IO_PORTD: // Port D
- {
+ case AVR8_IO_PORTD:
m_port_d = data;
- uint8_t audio_sample = (data & 0x02) | ((data & 0xf4) >> 2);
- m_dac->write(audio_sample);
+ m_dac->write((data & 0x02) | ((data & 0xf4) >> 2));
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()
{
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;
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)
{
- memset(m_pixels, 0, start_clear);
+ //memset(&m_pixels[0], 0, start_clear);
}
}
m_last_cycles = frame_cycles;
}
-/****************************************************\
-* 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)
+uint32_t craft_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
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;
}
-/****************************************************\
-* Machine definition *
-\****************************************************/
+//**************************************************************************
+// MACHINE
+//**************************************************************************
+
+static INPUT_PORTS_START( craft )
+INPUT_PORTS_END
-void craft_state::init_craft()
+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()
{
m_frame_start_cycle = 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)
@@ -256,12 +244,8 @@ void craft_state::craft(machine_config &config)
/* video hardware */
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
- screen.set_refresh_hz(59.99);
- screen.set_vblank_time(ATTOSECONDS_IN_USEC(1429)); /* accurate */
- 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);
+ screen.set_raw(MASTER_CLOCK, 635, 47, 527, 525, 36, 516);
+ screen.set_screen_update(FUNC(craft_state::screen_update));
/* sound hardware */
SPEAKER(config, "avr8").front_center();
@@ -279,4 +263,4 @@ ROM_START( craft )
ROM_END
/* 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)