mirror of
https://github.com/holub/mame
synced 2025-06-06 12:53:46 +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 "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<bitmap_ind16> m_bitmap_render;
|
||||
std::unique_ptr<bitmap_ind16> m_bitmap_buffer;
|
||||
|
||||
|
||||
required_device<gigatron_cpu_device> m_maincpu;
|
||||
required_device<dac_byte_interface> m_dac;
|
||||
required_ioport m_io_inputs;
|
||||
};
|
||||
|
||||
//**************************************************************************
|
||||
// Video
|
||||
//**************************************************************************
|
||||
|
||||
void gigatron_state::video_start()
|
||||
{
|
||||
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)
|
||||
{
|
||||
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 )
|
||||
|
Loading…
Reference in New Issue
Block a user