From 88bfa9826d8fcd2a70ae3d615e3366ec0dceb061 Mon Sep 17 00:00:00 2001 From: Robbbert Date: Mon, 3 Aug 2020 03:28:20 +1000 Subject: [PATCH] dai: cleanup --- src/mame/drivers/dai.cpp | 54 +++++++++----------- src/mame/includes/dai.h | 82 +++++++++++++++--------------- src/mame/machine/dai.cpp | 105 ++++++++++++++++++++------------------- src/mame/video/dai.cpp | 6 +-- 4 files changed, 121 insertions(+), 126 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 }; + 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; + u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + IRQ_CALLBACK_MEMBER(int_ack); + + void mem_map(address_map &map); + + static const rgb_t s_palette[16]; + + 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 m_maincpu; required_device m_pit; required_device m_tms5501; required_device m_sound; required_device m_cassette; - required_device m_ram; + required_region_ptr m_rom; + required_shared_ptr m_ram; required_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); - 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); - IRQ_CALLBACK_MEMBER(int_ack); - - void dai_io(address_map &map); - void dai_mem(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; + 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 */