diff options
Diffstat (limited to 'src/mame/drivers/craft.cpp')
-rw-r--r-- | src/mame/drivers/craft.cpp | 206 |
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) |