summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Robbbert <Robbbert@users.noreply.github.com>2020-08-03 03:28:20 +1000
committer Robbbert <Robbbert@users.noreply.github.com>2020-08-03 03:28:20 +1000
commit88bfa9826d8fcd2a70ae3d615e3366ec0dceb061 (patch)
tree8b6e21c105e203738a02d45ce29d293a2da14962
parentb481fa32684e431f73547c03b58f5a03c523f37c (diff)
dai: cleanup
-rw-r--r--src/mame/drivers/dai.cpp54
-rw-r--r--src/mame/includes/dai.h76
-rw-r--r--src/mame/machine/dai.cpp105
-rw-r--r--src/mame/video/dai.cpp6
4 files changed, 118 insertions, 123 deletions
diff --git a/src/mame/drivers/dai.cpp b/src/mame/drivers/dai.cpp
index 7bc2af9a8e2..5cc6d97261f 100644
--- a/src/mame/drivers/dai.cpp
+++ b/src/mame/drivers/dai.cpp
@@ -63,26 +63,21 @@ Timings:
#include "emu.h"
#include "includes/dai.h"
#include "screen.h"
-#include "softlist.h"
#include "speaker.h"
-/* I/O ports */
-void dai_state::dai_io(address_map &map)
-{
-}
/* memory w/r functions */
-void dai_state::dai_mem(address_map &map)
+void dai_state::mem_map(address_map &map)
{
- map(0x0000, 0xbfff).bankrw("bank1");
- map(0xc000, 0xdfff).rom();
+ map(0x0000, 0xbfff).ram().share("mainram");
+ map(0xc000, 0xdfff).rom().region("maincpu",0);
map(0xe000, 0xefff).bankr("bank2");
- map(0xf000, 0xf7ff).w(FUNC(dai_state::dai_stack_interrupt_circuit_w));
+ map(0xf000, 0xf7ff).w(FUNC(dai_state::stack_interrupt_circuit_w));
map(0xf800, 0xf8ff).ram();
- map(0xfb00, 0xfbff).rw(FUNC(dai_state::dai_amd9511_r), FUNC(dai_state::dai_amd9511_w));
- map(0xfc00, 0xfcff).rw(FUNC(dai_state::dai_pit_r), FUNC(dai_state::dai_pit_w)); // .rw("pit8253", FUNC(pit8253_device::read), FUNC(pit8253_device::write));
- map(0xfd00, 0xfdff).rw(FUNC(dai_state::dai_io_discrete_devices_r), FUNC(dai_state::dai_io_discrete_devices_w));
- map(0xfe00, 0xfeff).rw("ppi8255", FUNC(i8255_device::read), FUNC(i8255_device::write));
+ map(0xfb00, 0xfbff).rw(FUNC(dai_state::amd9511_r), FUNC(dai_state::amd9511_w));
+ map(0xfc00, 0xfcff).rw(FUNC(dai_state::pit_r), FUNC(dai_state::pit_w)); // .rw(m_pit, FUNC(pit8253_device::read), FUNC(pit8253_device::write));
+ map(0xfd00, 0xfdff).rw(FUNC(dai_state::io_discrete_devices_r), FUNC(dai_state::io_discrete_devices_w));
+ map(0xfe00, 0xfeff).rw("ppi", FUNC(i8255_device::read), FUNC(i8255_device::write));
map(0xff00, 0xff0f).mirror(0xf0).m(m_tms5501, FUNC(tms5501_device::io_map));
}
@@ -183,7 +178,7 @@ static const gfx_layout dai_charlayout =
};
static GFXDECODE_START( gfx_dai )
- GFXDECODE_ENTRY( "gfx1", 0x0000, dai_charlayout, 0, 8 )
+ GFXDECODE_ENTRY( "chargen", 0x0000, dai_charlayout, 0, 8 )
GFXDECODE_END
/* machine definition */
@@ -191,8 +186,7 @@ void dai_state::dai(machine_config &config)
{
/* basic machine hardware */
I8080(config, m_maincpu, 2000000);
- m_maincpu->set_addrmap(AS_PROGRAM, &dai_state::dai_mem);
- m_maincpu->set_addrmap(AS_IO, &dai_state::dai_io);
+ m_maincpu->set_addrmap(AS_PROGRAM, &dai_state::mem_map);
m_maincpu->set_irq_acknowledge_callback(FUNC(dai_state::int_ack));
config.set_maximum_quantum(attotime::from_hz(60));
@@ -204,7 +198,7 @@ void dai_state::dai(machine_config &config)
m_pit->set_clk<2>(2000000);
m_pit->out_handler<2>().set(m_sound, FUNC(dai_sound_device::set_input_ch2));
- I8255(config, "ppi8255");
+ I8255(config, "ppi");
/* video hardware */
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
@@ -212,7 +206,7 @@ void dai_state::dai(machine_config &config)
screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
screen.set_size(1056, 542);
screen.set_visarea(0, 1056-1, 0, 302-1);
- screen.set_screen_update(FUNC(dai_state::screen_update_dai));
+ screen.set_screen_update(FUNC(dai_state::screen_update));
screen.set_palette(m_palette);
GFXDECODE(config, "gfxdecode", m_palette, gfx_dai);
@@ -234,11 +228,8 @@ void dai_state::dai(machine_config &config)
/* tms5501 */
TMS5501(config, m_tms5501, 2000000);
m_tms5501->int_callback().set_inputline("maincpu", I8085_INTR_LINE);
- m_tms5501->xi_callback().set(FUNC(dai_state::dai_keyboard_r));
- m_tms5501->xo_callback().set(FUNC(dai_state::dai_keyboard_w));
-
- /* internal ram */
- RAM(config, RAM_TAG).set_default_size("48K");
+ m_tms5501->xi_callback().set(FUNC(dai_state::keyboard_r));
+ m_tms5501->xo_callback().set(FUNC(dai_state::keyboard_w));
/* software lists */
SOFTWARE_LIST(config, "cass_list").set_original("dai_cass");
@@ -246,15 +237,16 @@ void dai_state::dai(machine_config &config)
ROM_START(dai)
- ROM_REGION(0x14000,"maincpu",0)
- ROM_LOAD("dai.bin", 0xc000, 0x2000, CRC(ca71a7d5) SHA1(6bbe2336c717354beab2ae201debeb4fd055bdcb))
- ROM_LOAD("dai00.bin", 0x10000, 0x1000, CRC(fa7d39ac) SHA1(3d1824a1f273882f934249ef3cb1b38ef99de7b9))
- ROM_LOAD("dai01.bin", 0x11000, 0x1000, CRC(cb5809f2) SHA1(523656f0a9d98888cd3e2bd66886c589e9ae75b4))
- ROM_LOAD("dai02.bin", 0x12000, 0x1000, CRC(03f72d4a) SHA1(573d65dc82321970dcaf81d7638a02252ea18a7a))
- ROM_LOAD("dai03.bin", 0x13000, 0x1000, CRC(c475c96f) SHA1(96fc3cc4b8a2873f0d044bd8033d1e7b7197dd97))
- ROM_REGION(0x2000, "gfx1",0)
+ ROM_REGION(0x6000,"maincpu",0)
+ ROM_LOAD("dai.bin", 0x0000, 0x2000, CRC(ca71a7d5) SHA1(6bbe2336c717354beab2ae201debeb4fd055bdcb))
+ ROM_LOAD("dai00.bin", 0x2000, 0x1000, CRC(fa7d39ac) SHA1(3d1824a1f273882f934249ef3cb1b38ef99de7b9))
+ ROM_LOAD("dai01.bin", 0x3000, 0x1000, CRC(cb5809f2) SHA1(523656f0a9d98888cd3e2bd66886c589e9ae75b4))
+ ROM_LOAD("dai02.bin", 0x4000, 0x1000, CRC(03f72d4a) SHA1(573d65dc82321970dcaf81d7638a02252ea18a7a))
+ ROM_LOAD("dai03.bin", 0x5000, 0x1000, CRC(c475c96f) SHA1(96fc3cc4b8a2873f0d044bd8033d1e7b7197dd97))
+
+ ROM_REGION(0x2000, "chargen",0)
ROM_LOAD ("nch.bin", 0x0000, 0x1000, CRC(a9f5b30b) SHA1(24119b2984ab4e50dc0dabae1065ff6d6c1f237d))
ROM_END
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME */
-COMP( 1978, dai, 0, 0, dai, dai, dai_state, empty_init, "Data Applications International", "DAI Personal Computer", 0)
+COMP( 1978, dai, 0, 0, dai, dai, dai_state, empty_init, "Data Applications International", "DAI Personal Computer", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/includes/dai.h b/src/mame/includes/dai.h
index ac99048d192..56b8612cf60 100644
--- a/src/mame/includes/dai.h
+++ b/src/mame/includes/dai.h
@@ -13,7 +13,6 @@
#include "audio/dai_snd.h"
#include "machine/i8255.h"
#include "machine/pit8253.h"
-#include "machine/ram.h"
#include "machine/tms5501.h"
#include "imagedev/cassette.h"
#include "emupal.h"
@@ -22,15 +21,17 @@
class dai_state : public driver_device
{
public:
- dai_state(const machine_config &mconfig, device_type type, const char *tag) :
- driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu"),
- m_pit(*this, "pit8253"),
- m_tms5501(*this, "tms5501"),
- m_sound(*this, "custom"),
- m_cassette(*this, "cassette"),
- m_ram(*this, RAM_TAG),
- m_palette(*this, "palette")
+ dai_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_pit(*this, "pit")
+ , m_tms5501(*this, "tms5501")
+ , m_sound(*this, "custom")
+ , m_cassette(*this, "cassette")
+ , m_rom(*this, "maincpu")
+ , m_ram(*this, "mainram")
+ , m_palette(*this, "palette")
+ , m_io_keyboard(*this, "IN%u", 0U)
{ }
void dai(machine_config &config);
@@ -38,46 +39,45 @@ public:
private:
enum
{
- TIMER_BOOTSTRAP,
TIMER_TMS5501
};
- required_device<cpu_device> m_maincpu;
- required_device<pit8253_device> m_pit;
- required_device<tms5501_device> m_tms5501;
- required_device<dai_sound_device> m_sound;
- required_device<cassette_image_device> m_cassette;
- required_device<ram_device> m_ram;
- required_device<palette_device> m_palette;
-
- uint8_t m_paddle_select;
- uint8_t m_paddle_enable;
- uint8_t m_cassette_motor[2];
- uint8_t m_keyboard_scan_mask;
- unsigned short m_4_colours_palette[4];
- void dai_stack_interrupt_circuit_w(uint8_t data);
- uint8_t dai_io_discrete_devices_r(offs_t offset);
- void dai_io_discrete_devices_w(offs_t offset, uint8_t data);
- uint8_t dai_amd9511_r();
- void dai_amd9511_w(offs_t offset, uint8_t data);
- uint8_t dai_pit_r(offs_t offset);
- void dai_pit_w(offs_t offset, uint8_t data);
- uint8_t dai_keyboard_r();
- void dai_keyboard_w(uint8_t data);
+ u8 m_paddle_select;
+ u8 m_paddle_enable;
+ u8 m_cassette_motor[2];
+ u8 m_keyboard_scan_mask;
+ u8 m_4_colours_palette[4];
+ void stack_interrupt_circuit_w(u8 data);
+ u8 io_discrete_devices_r(offs_t offset);
+ void io_discrete_devices_w(offs_t offset, u8 data);
+ u8 amd9511_r();
+ void amd9511_w(offs_t offset, u8 data);
+ u8 pit_r(offs_t offset);
+ void pit_w(offs_t offset, u8 data);
+ u8 keyboard_r();
+ void keyboard_w(u8 data);
void dai_palette(palette_device &palette) const;
- uint32_t screen_update_dai(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- void dai_update_memory(int dai_rom_bank);
+ u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
IRQ_CALLBACK_MEMBER(int_ack);
- void dai_io(address_map &map);
- void dai_mem(address_map &map);
+ void mem_map(address_map &map);
static const rgb_t s_palette[16];
-protected:
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
+
+ memory_passthrough_handler *m_rom_shadow_tap;
+ required_device<cpu_device> m_maincpu;
+ required_device<pit8253_device> m_pit;
+ required_device<tms5501_device> m_tms5501;
+ required_device<dai_sound_device> m_sound;
+ required_device<cassette_image_device> m_cassette;
+ required_region_ptr<u8> m_rom;
+ required_shared_ptr<u8> m_ram;
+ required_device<palette_device> m_palette;
+ required_ioport_array<9> m_io_keyboard;
};
diff --git a/src/mame/machine/dai.cpp b/src/mame/machine/dai.cpp
index 06cca62cf93..c569f898399 100644
--- a/src/mame/machine/dai.cpp
+++ b/src/mame/machine/dai.cpp
@@ -23,11 +23,8 @@ void dai_state::device_timer(emu_timer &timer, device_timer_id id, int param, vo
{
switch (id)
{
- case TIMER_BOOTSTRAP:
- m_maincpu->set_pc(0xc000);
- break;
case TIMER_TMS5501:
- m_tms5501->xi7_w((ioport("IN8")->read() & 0x04) ? 1:0);
+ m_tms5501->xi7_w(BIT(m_io_keyboard[8]->read(), 2));
timer_set(attotime::from_hz(100), TIMER_TMS5501);
break;
default:
@@ -41,33 +38,24 @@ void dai_state::device_timer(emu_timer &timer, device_timer_id id, int param, vo
/* Memory */
-void dai_state::dai_stack_interrupt_circuit_w(uint8_t data)
+void dai_state::stack_interrupt_circuit_w(uint8_t data)
{
m_tms5501->sens_w(1);
m_tms5501->sens_w(0);
}
-void dai_state::dai_update_memory(int dai_rom_bank)
-{
- membank("bank2")->set_entry(dai_rom_bank);
-}
-
-
-uint8_t dai_state::dai_keyboard_r()
+uint8_t dai_state::keyboard_r()
{
uint8_t data = 0x00;
- static const char *const keynames[] = { "IN0", "IN1", "IN2", "IN3", "IN4", "IN5", "IN6", "IN7" };
- for (int i = 0; i < 8; i++)
- {
+ for (u8 i = 0; i < 8; i++)
if (m_keyboard_scan_mask & (1 << i))
- data |= ioport(keynames[i])->read();
- }
+ data |= m_io_keyboard[i]->read();
return data;
}
-void dai_state::dai_keyboard_w(uint8_t data)
+void dai_state::keyboard_w(uint8_t data)
{
m_keyboard_scan_mask = data;
}
@@ -79,16 +67,33 @@ IRQ_CALLBACK_MEMBER(dai_state::int_ack)
void dai_state::machine_start()
{
- membank("bank2")->configure_entries(0, 4, memregion("maincpu")->base() + 0x010000, 0x1000);
- timer_set(attotime::zero, TIMER_BOOTSTRAP);
+ membank("bank2")->configure_entries(0, 4, m_rom + 0x2000, 0x1000);
timer_set(attotime::from_hz(100), TIMER_TMS5501);
-
- memset(m_ram->pointer(), 0, m_ram->size());
+ save_item(NAME(m_paddle_select));
+ save_item(NAME(m_paddle_enable));
+ save_item(NAME(m_cassette_motor));
+ save_item(NAME(m_keyboard_scan_mask));
+ save_item(NAME(m_4_colours_palette));
}
void dai_state::machine_reset()
{
- membank("bank1")->set_base(m_ram->pointer());
+ address_space &program = m_maincpu->space(AS_PROGRAM);
+ program.install_rom(0x0000, 0x07ff, m_rom); // do it here for F3
+ m_rom_shadow_tap = program.install_read_tap(0xc000, 0xc7ff, "rom_shadow_r",[this](offs_t offset, u8 &data, u8 mem_mask)
+ {
+ if (!machine().side_effects_disabled())
+ {
+ // delete this tap
+ m_rom_shadow_tap->remove();
+
+ // reinstall ram over the rom shadow
+ m_maincpu->space(AS_PROGRAM).install_ram(0x0000, 0x07ff, m_ram);
+ }
+
+ // return the original data
+ return data;
+ });
}
/***************************************************************************
@@ -120,13 +125,13 @@ void dai_state::machine_reset()
bit 6-7 ROM bank switching
***************************************************************************/
-uint8_t dai_state::dai_io_discrete_devices_r(offs_t offset)
+uint8_t dai_state::io_discrete_devices_r(offs_t offset)
{
- uint8_t data = 0x00;
+ uint8_t data = 0xff;
- switch(offset & 0x000f) {
- case 0x00:
- data = ioport("IN8")->read();
+ switch(offset & 0x0f) {
+ case 0:
+ data = m_io_keyboard[8]->read();
data |= 0x08; // serial ready
if (machine().rand()&0x01)
data |= 0x40; // random number generator
@@ -135,42 +140,40 @@ uint8_t dai_state::dai_io_discrete_devices_r(offs_t offset)
break;
default:
- data = 0xff;
LOG_DAI_PORT_R (offset, data, "discrete devices - unmapped");
-
break;
}
return data;
}
-void dai_state::dai_io_discrete_devices_w(offs_t offset, uint8_t data)
+void dai_state::io_discrete_devices_w(offs_t offset, uint8_t data)
{
switch(offset & 0x000f) {
case 0x04:
m_sound->set_volume(offset, data);
LOG_DAI_PORT_W (offset, data&0x0f, "discrete devices - osc. 0 volume");
- LOG_DAI_PORT_W (offset, (data&0xf0)>>4, "discrete devices - osc. 1 volume");
+ LOG_DAI_PORT_W (offset, BIT(data, 4, 4), "discrete devices - osc. 1 volume");
break;
case 0x05:
m_sound->set_volume(offset, data);
LOG_DAI_PORT_W (offset, data&0x0f, "discrete devices - osc. 2 volume");
- LOG_DAI_PORT_W (offset, (data&0xf0)>>4, "discrete devices - noise volume");
+ LOG_DAI_PORT_W (offset, BIT(data, 4, 4), "discrete devices - noise volume");
break;
case 0x06:
- m_paddle_select = (data&0x06)>>2;
- m_paddle_enable = (data&0x08)>>3;
- m_cassette_motor[0] = (data&0x10)>>4;
- m_cassette_motor[1] = (data&0x20)>>5;
+ m_paddle_select = BIT(data, 1, 2);
+ m_paddle_enable = BIT(data, 3);
+ m_cassette_motor[0] = BIT(data, 4);
+ m_cassette_motor[1] = BIT(data, 5);
m_cassette->change_state(m_cassette_motor[0]?CASSETTE_MOTOR_DISABLED:CASSETTE_MOTOR_ENABLED, CASSETTE_MASK_MOTOR);
- m_cassette->output((data & 0x01) ? -1.0 : 1.0);
- dai_update_memory ((data&0xc0)>>6);
- LOG_DAI_PORT_W (offset, (data&0x06)>>2, "discrete devices - paddle select");
- LOG_DAI_PORT_W (offset, (data&0x08)>>3, "discrete devices - paddle enable");
- LOG_DAI_PORT_W (offset, (data&0x10)>>4, "discrete devices - cassette motor 1");
- LOG_DAI_PORT_W (offset, (data&0x20)>>5, "discrete devices - cassette motor 2");
- LOG_DAI_PORT_W (offset, (data&0xc0)>>6, "discrete devices - ROM bank");
+ m_cassette->output(BIT(data, 0) ? -1.0 : 1.0);
+ membank("bank2")->set_entry(BIT(data, 6, 2));
+ LOG_DAI_PORT_W (offset, BIT(data, 1, 2), "discrete devices - paddle select");
+ LOG_DAI_PORT_W (offset, BIT(data, 3), "discrete devices - paddle enable");
+ LOG_DAI_PORT_W (offset, BIT(data, 4), "discrete devices - cassette motor 1");
+ LOG_DAI_PORT_W (offset, BIT(data, 5), "discrete devices - cassette motor 2");
+ LOG_DAI_PORT_W (offset, BIT(data, 6, 2), "discrete devices - ROM bank");
break;
default:
@@ -188,14 +191,14 @@ void dai_state::dai_io_discrete_devices_w(offs_t offset, uint8_t data)
***************************************************************************/
-uint8_t dai_state::dai_pit_r(offs_t offset)
+uint8_t dai_state::pit_r(offs_t offset)
{
- return m_pit->read((offset >> 1) & 3);
+ return m_pit->read(BIT(offset, 1, 2));
}
-void dai_state::dai_pit_w(offs_t offset, uint8_t data)
+void dai_state::pit_w(offs_t offset, uint8_t data)
{
- m_pit->write((offset >> 1) & 3, data);
+ m_pit->write(BIT(offset, 1, 2), data);
}
/***************************************************************************
@@ -204,13 +207,13 @@ void dai_state::dai_pit_w(offs_t offset, uint8_t data)
***************************************************************************/
-uint8_t dai_state::dai_amd9511_r()
+uint8_t dai_state::amd9511_r()
{
- /* optional and no present at this moment */
+ /* optional and not present at this moment */
return 0xff;
}
-void dai_state::dai_amd9511_w(offs_t offset, uint8_t data)
+void dai_state::amd9511_w(offs_t offset, uint8_t data)
{
logerror ("Writing to AMD9511 math chip, %04x, %02x\n", offset, data);
}
diff --git a/src/mame/video/dai.cpp b/src/mame/video/dai.cpp
index 77f507957eb..13891a8cda9 100644
--- a/src/mame/video/dai.cpp
+++ b/src/mame/video/dai.cpp
@@ -9,7 +9,7 @@
Krzysztof Strzecha
All video modes are emulated but not fully tested yet.
- dai_state::screen_update_dai() function needs strong cleanup and optimalisation.
+ dai_state::screen_update() function needs strong cleanup and optimisation.
***************************************************************************/
@@ -47,12 +47,12 @@ void dai_state::dai_palette(palette_device &palette) const
palette.set_pen_colors(0, s_palette);
}
-uint32_t dai_state::screen_update_dai(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+uint32_t dai_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
address_space &space = m_maincpu->space(AS_PROGRAM);
int i, j, k, l;
- uint8_t* char_rom = memregion("gfx1")->base();
+ uint8_t* char_rom = memregion("chargen")->base();
uint16_t dai_video_memory_start = 0xbfff;
uint16_t dai_scan_lines = 604; /* scan lines of PAL tv */