diff --git a/src/mame/drivers/gigatron.cpp b/src/mame/drivers/gigatron.cpp index fc338339f37..f1fd35491b7 100644 --- a/src/mame/drivers/gigatron.cpp +++ b/src/mame/drivers/gigatron.cpp @@ -13,19 +13,26 @@ #include "emu.h" #include "cpu/gigatron/gigatron.h" #include "screen.h" +#include "sound/dac.h" +#include "sound/volt_reg.h" #include "speaker.h" #define MAIN_CLOCK 6250000 #define VSYNC 0x80 #define HSYNC 0x40 +//************************************************************************** +// Driver Definition +//************************************************************************** + class gigatron_state : public driver_device { public: gigatron_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_io_inputs(*this, "GAMEPAD") + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_dac(*this, "dac") + , m_io_inputs(*this, "GAMEPAD") { } @@ -43,25 +50,31 @@ private: void prog_map(address_map &map); void data_map(address_map &map); - uint16_t lights_changed; - + uint16_t m_lc; //Lights Changed + //Video Generation stuff - uint8_t machineOut; - uint8_t row; - uint8_t col; - uint8_t pixel; + uint8_t m_out; + uint8_t m_row; + uint8_t m_col; + uint8_t m_pixel; void blinkenlights(uint8_t data); void video_draw(u8 data); uint8_t inputs(); - + void port_outx(uint8_t data); + std::unique_ptr m_bitmap_render; std::unique_ptr m_bitmap_buffer; - + required_device m_maincpu; + required_device m_dac; required_ioport m_io_inputs; }; +//************************************************************************** +// Video +//************************************************************************** + void gigatron_state::video_start() { m_bitmap_render = std::make_unique(640, 480); @@ -71,28 +84,28 @@ void gigatron_state::video_start() void gigatron_state::video_draw(u8 data) { uint8_t out = data; - uint8_t falling = machineOut & ~out; - + uint8_t falling = m_out & ~out; + if (falling & VSYNC) { - row = 0; - pixel = 0; + m_row = 0; + m_pixel = 0; } - + if (falling & HSYNC) { - col = 0; - row++; + m_col = 0; + m_row++; } - - machineOut = out; - + + m_out = out; + if ((out & (VSYNC | HSYNC)) != (VSYNC | HSYNC)) { return; } - - if((row >= 0 && row < 480) && (col >= 0 && col < 640)) + + if((m_row >= 0 && m_row < 480) && (m_col >= 0 && m_col < 640)) { //uint16_t *dest; //uint8_t tPixel = pixel; @@ -107,6 +120,10 @@ uint32_t gigatron_state::screen_update(screen_device &screen, bitmap_rgb32 &bitm return 0; } +//************************************************************************** +// Memory Map +//************************************************************************** + void gigatron_state::prog_map(address_map &map) { map(0x0000, 0x3fff).rom().region("maincpu", 0); @@ -117,24 +134,9 @@ void gigatron_state::data_map(address_map &map) map(0x0000, 0x7fff).ram(); } -void gigatron_state::machine_start() -{ -} - -void gigatron_state::machine_reset() -{ -} - -void gigatron_state::blinkenlights(uint8_t data) -{ - uint16_t light = data & 0xF; - lights_changed ^= light; -} - -uint8_t gigatron_state::inputs() -{ - return m_io_inputs->read() ^ 0xFF; -} +//************************************************************************** +// Machine +//************************************************************************** static INPUT_PORTS_START(gigatron) PORT_START("GAMEPAD") @@ -148,12 +150,43 @@ static INPUT_PORTS_START(gigatron) PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("A Button") PORT_PLAYER(1) // A Button INPUT_PORTS_END +void gigatron_state::machine_start() +{ + save_item(NAME(m_lc)); + save_item(NAME(m_out)); + save_item(NAME(m_row)); + save_item(NAME(m_col)); + save_item(NAME(m_pixel)); +} + +void gigatron_state::machine_reset() +{ + m_dac->write(0); +} + +void gigatron_state::port_outx(uint8_t data) +{ + blinkenlights(data & 0x0F); + m_dac->write((data & 0xF0) >> 4); +} + +void gigatron_state::blinkenlights(uint8_t data) +{ + uint16_t light = data & 0xF; + m_lc ^= light; +} + +uint8_t gigatron_state::inputs() +{ + return m_io_inputs->read() ^ 0xFF; +} + void gigatron_state::gigatron(machine_config &config) { GTRON(config, m_maincpu, MAIN_CLOCK); m_maincpu->set_addrmap(AS_PROGRAM, &gigatron_state::prog_map); m_maincpu->set_addrmap(AS_DATA, &gigatron_state::data_map); - m_maincpu->outx_cb().set(FUNC(gigatron_state::blinkenlights)); + m_maincpu->outx_cb().set(FUNC(gigatron_state::port_outx)); m_maincpu->out_cb().set(FUNC(gigatron_state::video_draw)); m_maincpu->ir_cb().set(FUNC(gigatron_state::inputs)); @@ -165,7 +198,11 @@ void gigatron_state::gigatron(machine_config &config) screen.set_screen_update(FUNC(gigatron_state::screen_update)); /* sound hardware */ - //SPEAKER(config, "mono").front_center(); + SPEAKER(config, "speaker").front_center(); + DAC_4BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.5); + voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0)); + vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); + vref.add_route(0, "dac", -1.0, DAC_VREF_NEG_INPUT); } ROM_START( gigatron )