mirror of
https://github.com/holub/mame
synced 2025-06-08 05:44:09 +03:00
gigatron: add DAC (#6977)
* gigatron: add DAC, clean up, and do a bit of work on port OUTX
This commit is contained in:
parent
64fdf1306e
commit
2201be3d47
@ -13,19 +13,26 @@
|
|||||||
#include "emu.h"
|
#include "emu.h"
|
||||||
#include "cpu/gigatron/gigatron.h"
|
#include "cpu/gigatron/gigatron.h"
|
||||||
#include "screen.h"
|
#include "screen.h"
|
||||||
|
#include "sound/dac.h"
|
||||||
|
#include "sound/volt_reg.h"
|
||||||
#include "speaker.h"
|
#include "speaker.h"
|
||||||
|
|
||||||
#define MAIN_CLOCK 6250000
|
#define MAIN_CLOCK 6250000
|
||||||
#define VSYNC 0x80
|
#define VSYNC 0x80
|
||||||
#define HSYNC 0x40
|
#define HSYNC 0x40
|
||||||
|
|
||||||
|
//**************************************************************************
|
||||||
|
// Driver Definition
|
||||||
|
//**************************************************************************
|
||||||
|
|
||||||
class gigatron_state : public driver_device
|
class gigatron_state : public driver_device
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
gigatron_state(const machine_config &mconfig, device_type type, const char *tag)
|
gigatron_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_io_inputs(*this, "GAMEPAD")
|
, m_dac(*this, "dac")
|
||||||
|
, m_io_inputs(*this, "GAMEPAD")
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -43,25 +50,31 @@ private:
|
|||||||
void prog_map(address_map &map);
|
void prog_map(address_map &map);
|
||||||
void data_map(address_map &map);
|
void data_map(address_map &map);
|
||||||
|
|
||||||
uint16_t lights_changed;
|
uint16_t m_lc; //Lights Changed
|
||||||
|
|
||||||
//Video Generation stuff
|
//Video Generation stuff
|
||||||
uint8_t machineOut;
|
uint8_t m_out;
|
||||||
uint8_t row;
|
uint8_t m_row;
|
||||||
uint8_t col;
|
uint8_t m_col;
|
||||||
uint8_t pixel;
|
uint8_t m_pixel;
|
||||||
|
|
||||||
void blinkenlights(uint8_t data);
|
void blinkenlights(uint8_t data);
|
||||||
void video_draw(u8 data);
|
void video_draw(u8 data);
|
||||||
uint8_t inputs();
|
uint8_t inputs();
|
||||||
|
void port_outx(uint8_t data);
|
||||||
|
|
||||||
std::unique_ptr<bitmap_ind16> m_bitmap_render;
|
std::unique_ptr<bitmap_ind16> m_bitmap_render;
|
||||||
std::unique_ptr<bitmap_ind16> m_bitmap_buffer;
|
std::unique_ptr<bitmap_ind16> m_bitmap_buffer;
|
||||||
|
|
||||||
required_device<gigatron_cpu_device> m_maincpu;
|
required_device<gigatron_cpu_device> m_maincpu;
|
||||||
|
required_device<dac_byte_interface> m_dac;
|
||||||
required_ioport m_io_inputs;
|
required_ioport m_io_inputs;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//**************************************************************************
|
||||||
|
// Video
|
||||||
|
//**************************************************************************
|
||||||
|
|
||||||
void gigatron_state::video_start()
|
void gigatron_state::video_start()
|
||||||
{
|
{
|
||||||
m_bitmap_render = std::make_unique<bitmap_ind16>(640, 480);
|
m_bitmap_render = std::make_unique<bitmap_ind16>(640, 480);
|
||||||
@ -71,28 +84,28 @@ void gigatron_state::video_start()
|
|||||||
void gigatron_state::video_draw(u8 data)
|
void gigatron_state::video_draw(u8 data)
|
||||||
{
|
{
|
||||||
uint8_t out = data;
|
uint8_t out = data;
|
||||||
uint8_t falling = machineOut & ~out;
|
uint8_t falling = m_out & ~out;
|
||||||
|
|
||||||
if (falling & VSYNC)
|
if (falling & VSYNC)
|
||||||
{
|
{
|
||||||
row = 0;
|
m_row = 0;
|
||||||
pixel = 0;
|
m_pixel = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (falling & HSYNC)
|
if (falling & HSYNC)
|
||||||
{
|
{
|
||||||
col = 0;
|
m_col = 0;
|
||||||
row++;
|
m_row++;
|
||||||
}
|
}
|
||||||
|
|
||||||
machineOut = out;
|
m_out = out;
|
||||||
|
|
||||||
if ((out & (VSYNC | HSYNC)) != (VSYNC | HSYNC))
|
if ((out & (VSYNC | HSYNC)) != (VSYNC | HSYNC))
|
||||||
{
|
{
|
||||||
return;
|
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;
|
//uint16_t *dest;
|
||||||
//uint8_t tPixel = pixel;
|
//uint8_t tPixel = pixel;
|
||||||
@ -107,6 +120,10 @@ uint32_t gigatron_state::screen_update(screen_device &screen, bitmap_rgb32 &bitm
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//**************************************************************************
|
||||||
|
// Memory Map
|
||||||
|
//**************************************************************************
|
||||||
|
|
||||||
void gigatron_state::prog_map(address_map &map)
|
void gigatron_state::prog_map(address_map &map)
|
||||||
{
|
{
|
||||||
map(0x0000, 0x3fff).rom().region("maincpu", 0);
|
map(0x0000, 0x3fff).rom().region("maincpu", 0);
|
||||||
@ -117,24 +134,9 @@ void gigatron_state::data_map(address_map &map)
|
|||||||
map(0x0000, 0x7fff).ram();
|
map(0x0000, 0x7fff).ram();
|
||||||
}
|
}
|
||||||
|
|
||||||
void gigatron_state::machine_start()
|
//**************************************************************************
|
||||||
{
|
// Machine
|
||||||
}
|
//**************************************************************************
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
static INPUT_PORTS_START(gigatron)
|
static INPUT_PORTS_START(gigatron)
|
||||||
PORT_START("GAMEPAD")
|
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
|
PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("A Button") PORT_PLAYER(1) // A Button
|
||||||
INPUT_PORTS_END
|
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)
|
void gigatron_state::gigatron(machine_config &config)
|
||||||
{
|
{
|
||||||
GTRON(config, m_maincpu, MAIN_CLOCK);
|
GTRON(config, m_maincpu, MAIN_CLOCK);
|
||||||
m_maincpu->set_addrmap(AS_PROGRAM, &gigatron_state::prog_map);
|
m_maincpu->set_addrmap(AS_PROGRAM, &gigatron_state::prog_map);
|
||||||
m_maincpu->set_addrmap(AS_DATA, &gigatron_state::data_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->out_cb().set(FUNC(gigatron_state::video_draw));
|
||||||
m_maincpu->ir_cb().set(FUNC(gigatron_state::inputs));
|
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));
|
screen.set_screen_update(FUNC(gigatron_state::screen_update));
|
||||||
|
|
||||||
/* sound hardware */
|
/* 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 )
|
ROM_START( gigatron )
|
||||||
|
Loading…
Reference in New Issue
Block a user