mirror of
https://github.com/holub/mame
synced 2025-04-20 15:32:45 +03:00
oric: Re-modernize (last time was in 2014, so...)
This commit is contained in:
parent
2b424f5a80
commit
48477df39f
@ -31,10 +31,21 @@ INPUT_PORTS_START( jasmin )
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Boot") PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1)) PORT_CHANGED_MEMBER(DEVICE_SELF, oric_jasmin_device, boot_pressed, 0)
|
||||
INPUT_PORTS_END
|
||||
|
||||
void oric_jasmin_device::map(address_map &map)
|
||||
void oric_jasmin_device::map_io(address_space_installer &space)
|
||||
{
|
||||
map(0x3f4, 0x3f7).rw("fdc", FUNC(wd1770_device::read), FUNC(wd1770_device::write));
|
||||
map(0x3f8, 0x3ff).w(m_fdlatch, FUNC(ls259_device::write_d0));
|
||||
space.install_read_handler(0x3f4, 0x3f7, read8sm_delegate(m_fdc, FUNC(wd1770_device::read)));
|
||||
space.install_write_handler(0x3f4, 0x3f7, write8sm_delegate(m_fdc, FUNC(wd1770_device::write)));
|
||||
|
||||
space.install_write_handler(0x3f8, 0x3ff, write8sm_delegate(m_fdlatch, FUNC(ls259_device::write_d0)));
|
||||
}
|
||||
|
||||
void oric_jasmin_device::map_rom()
|
||||
{
|
||||
(*view)[2].unmap_write(0xf800, 0xffff);
|
||||
(*view)[2].install_rom(0xf800, 0xffff, m_jasmin_rom);
|
||||
|
||||
(*view)[3].unmap_readwrite(0xc000, 0xffff);
|
||||
(*view)[3].install_rom(0xf800, 0xffff, m_jasmin_rom);
|
||||
}
|
||||
|
||||
oric_jasmin_device::oric_jasmin_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
|
||||
@ -54,7 +65,6 @@ oric_jasmin_device::~oric_jasmin_device()
|
||||
|
||||
void oric_jasmin_device::device_start()
|
||||
{
|
||||
cpu->space(AS_PROGRAM).install_device(0x0000, 0xffff, *this, &oric_jasmin_device::map);
|
||||
}
|
||||
|
||||
const tiny_rom_entry *oric_jasmin_device::device_rom_region() const
|
||||
@ -91,37 +101,15 @@ ioport_constructor oric_jasmin_device::device_input_ports() const
|
||||
void oric_jasmin_device::remap()
|
||||
{
|
||||
if(m_fdlatch->q3_r()) {
|
||||
if(m_fdlatch->q2_r()) {
|
||||
bank_c000_r->set_base(ram+0xc000);
|
||||
bank_e000_r->set_base(ram+0xe000);
|
||||
bank_f800_r->set_base(m_jasmin_rom.target());
|
||||
bank_c000_w->set_base(ram+0xc000);
|
||||
bank_e000_w->set_base(ram+0xe000);
|
||||
bank_f800_w->set_base(junk_write);
|
||||
} else {
|
||||
bank_c000_r->set_base(junk_read);
|
||||
bank_e000_r->set_base(junk_read);
|
||||
bank_f800_r->set_base(m_jasmin_rom.target());
|
||||
bank_c000_w->set_base(junk_write);
|
||||
bank_e000_w->set_base(junk_write);
|
||||
bank_f800_w->set_base(junk_write);
|
||||
}
|
||||
if(m_fdlatch->q2_r())
|
||||
view->select(3);
|
||||
else
|
||||
view->select(2);
|
||||
} else {
|
||||
if(m_fdlatch->q2_r()) {
|
||||
bank_c000_r->set_base(ram+0xc000);
|
||||
bank_e000_r->set_base(ram+0xe000);
|
||||
bank_f800_r->set_base(ram+0xf800);
|
||||
bank_c000_w->set_base(ram+0xc000);
|
||||
bank_e000_w->set_base(ram+0xe000);
|
||||
bank_f800_w->set_base(ram+0xf800);
|
||||
} else {
|
||||
bank_c000_r->set_base(rom+0x0000);
|
||||
bank_e000_r->set_base(rom+0x2000);
|
||||
bank_f800_r->set_base(rom+0x3800);
|
||||
bank_c000_w->set_base(junk_write);
|
||||
bank_e000_w->set_base(junk_write);
|
||||
bank_f800_w->set_base(junk_write);
|
||||
}
|
||||
if(m_fdlatch->q2_r())
|
||||
view->select(1);
|
||||
else
|
||||
view->select(0);
|
||||
}
|
||||
}
|
||||
|
||||
@ -129,7 +117,8 @@ INPUT_CHANGED_MEMBER(oric_jasmin_device::boot_pressed)
|
||||
{
|
||||
if(newval) {
|
||||
m_fdlatch->write_bit(3, 1);
|
||||
cpu->reset();
|
||||
reset_w(1);
|
||||
reset_w(0);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -26,6 +26,9 @@ protected:
|
||||
virtual void device_add_mconfig(machine_config &config) override;
|
||||
virtual ioport_constructor device_input_ports() const override;
|
||||
|
||||
virtual void map_io(address_space_installer &space) override;
|
||||
virtual void map_rom() override;
|
||||
|
||||
private:
|
||||
void remap();
|
||||
|
||||
@ -34,8 +37,6 @@ private:
|
||||
DECLARE_WRITE_LINE_MEMBER(rom_access_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(select_w);
|
||||
|
||||
void map(address_map &map);
|
||||
|
||||
static void floppy_formats(format_registration &fr);
|
||||
|
||||
required_device<wd1770_device> m_fdc;
|
||||
|
@ -22,17 +22,28 @@ static void microdisc_floppies(device_slot_interface &device)
|
||||
device.option_add("3dsdd", FLOPPY_3_DSDD);
|
||||
}
|
||||
|
||||
void oric_microdisc_device::map(address_map &map)
|
||||
void oric_microdisc_device::map_io(address_space_installer &space)
|
||||
{
|
||||
map(0x310, 0x313).rw("fdc", FUNC(fd1793_device::read), FUNC(fd1793_device::write));
|
||||
map(0x314, 0x314).rw(FUNC(oric_microdisc_device::port_314_r), FUNC(oric_microdisc_device::port_314_w));
|
||||
map(0x318, 0x318).r(FUNC(oric_microdisc_device::port_318_r));
|
||||
space.install_read_handler(0x310, 0x313, read8sm_delegate(fdc, FUNC(fd1793_device::read)));
|
||||
space.install_write_handler(0x310, 0x313, write8sm_delegate(fdc, FUNC(fd1793_device::write)));
|
||||
|
||||
space.install_read_handler(0x314, 0x314, read8smo_delegate(*this, FUNC(oric_microdisc_device::port_314_r)));
|
||||
space.install_write_handler(0x314, 0x314, write8smo_delegate(*this, FUNC(oric_microdisc_device::port_314_w)));
|
||||
|
||||
space.install_read_handler(0x318, 0x318, read8smo_delegate(*this, FUNC(oric_microdisc_device::port_318_r)));
|
||||
}
|
||||
|
||||
void oric_microdisc_device::map_rom()
|
||||
{
|
||||
(*view)[2].unmap_write(0xe000, 0xffff);
|
||||
(*view)[2].install_rom(0xe000, 0xffff, microdisc_rom);
|
||||
}
|
||||
|
||||
oric_microdisc_device::oric_microdisc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
|
||||
device_t(mconfig, ORIC_MICRODISC, tag, owner, clock),
|
||||
device_oricext_interface(mconfig, *this),
|
||||
fdc(*this, "fdc"), microdisc_rom(nullptr),
|
||||
fdc(*this, "fdc"),
|
||||
microdisc_rom(*this, "microdisc"),
|
||||
floppies(*this, "fdc:%u", 0U),
|
||||
port_314(0), intrq_state(false), drq_state(false), hld_state(false)
|
||||
{
|
||||
@ -44,22 +55,15 @@ oric_microdisc_device::~oric_microdisc_device()
|
||||
|
||||
void oric_microdisc_device::device_start()
|
||||
{
|
||||
microdisc_rom = device().machine().root_device().memregion(this->subtag("microdisc").c_str())->base();
|
||||
cpu->space(AS_PROGRAM).install_device(0x0000, 0xffff, *this, &oric_microdisc_device::map);
|
||||
|
||||
intrq_state = drq_state = hld_state = false;
|
||||
}
|
||||
|
||||
void oric_microdisc_device::device_reset()
|
||||
{
|
||||
port_314 = 0x00;
|
||||
view->select(2);
|
||||
irq_w(false);
|
||||
remap();
|
||||
fdc->set_floppy(floppies[0]->get_device());
|
||||
|
||||
// The bootstrap checksums part of the high ram and if the sum is
|
||||
// 0 it goes wrong.
|
||||
ram[0xe000] = 0x42;
|
||||
}
|
||||
|
||||
const tiny_rom_entry *oric_microdisc_device::device_rom_region() const
|
||||
@ -81,36 +85,16 @@ void oric_microdisc_device::device_add_mconfig(machine_config &config)
|
||||
FLOPPY_CONNECTOR(config, "fdc:3", microdisc_floppies, nullptr, oric_microdisc_device::floppy_formats);
|
||||
}
|
||||
|
||||
void oric_microdisc_device::remap()
|
||||
{
|
||||
if(port_314 & P_ROMDIS) {
|
||||
bank_c000_r->set_base(rom+0x0000);
|
||||
bank_e000_r->set_base(rom+0x2000);
|
||||
bank_f800_r->set_base(rom+0x3800);
|
||||
bank_c000_w->set_base(junk_write);
|
||||
bank_e000_w->set_base(junk_write);
|
||||
bank_f800_w->set_base(junk_write);
|
||||
} else {
|
||||
bank_c000_r->set_base(ram+0xc000);
|
||||
bank_c000_w->set_base(ram+0xc000);
|
||||
if(port_314 & P_EPROM) {
|
||||
bank_e000_r->set_base(ram+0xe000);
|
||||
bank_f800_r->set_base(ram+0xf800);
|
||||
bank_e000_w->set_base(ram+0xe000);
|
||||
bank_f800_w->set_base(ram+0xf800);
|
||||
} else {
|
||||
bank_e000_r->set_base(microdisc_rom+0x0000);
|
||||
bank_f800_r->set_base(microdisc_rom+0x1800);
|
||||
bank_e000_w->set_base(junk_write);
|
||||
bank_f800_w->set_base(junk_write);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void oric_microdisc_device::port_314_w(uint8_t data)
|
||||
{
|
||||
port_314 = data;
|
||||
remap();
|
||||
if(port_314 & P_ROMDIS)
|
||||
view->select(0);
|
||||
else if(port_314 & P_EPROM)
|
||||
view->select(1);
|
||||
else
|
||||
view->select(2);
|
||||
|
||||
floppy_image_device *floppy = floppies[(port_314 >> 5) & 3]->get_device();
|
||||
fdc->set_floppy(floppy);
|
||||
fdc->dden_w(port_314 & P_DDEN);
|
||||
@ -144,7 +128,6 @@ WRITE_LINE_MEMBER(oric_microdisc_device::fdc_drq_w)
|
||||
|
||||
WRITE_LINE_MEMBER(oric_microdisc_device::fdc_hld_w)
|
||||
{
|
||||
logerror("hld %d\n", state);
|
||||
hld_state = state;
|
||||
floppy_image_device *floppy = floppies[(port_314 >> 5) & 3]->get_device();
|
||||
if(floppy)
|
||||
|
@ -26,21 +26,22 @@ protected:
|
||||
P_EPROM = 0x80
|
||||
};
|
||||
|
||||
required_device<fd1793_device> fdc;
|
||||
|
||||
uint8_t *microdisc_rom;
|
||||
required_device_array<floppy_connector, 4> floppies;
|
||||
uint8_t port_314;
|
||||
bool intrq_state, drq_state, hld_state;
|
||||
|
||||
virtual void device_start() override;
|
||||
virtual void device_reset() override;
|
||||
const tiny_rom_entry *device_rom_region() const override;
|
||||
virtual void device_add_mconfig(machine_config &config) override;
|
||||
|
||||
void remap();
|
||||
virtual void map_io(address_space_installer &space) override;
|
||||
virtual void map_rom() override;
|
||||
|
||||
private:
|
||||
required_device<fd1793_device> fdc;
|
||||
required_region_ptr<uint8_t> microdisc_rom;
|
||||
required_device_array<floppy_connector, 4> floppies;
|
||||
|
||||
uint8_t port_314;
|
||||
bool intrq_state, drq_state, hld_state;
|
||||
|
||||
DECLARE_WRITE_LINE_MEMBER(fdc_irq_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(fdc_drq_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(fdc_hld_w);
|
||||
@ -49,8 +50,6 @@ private:
|
||||
uint8_t port_314_r();
|
||||
uint8_t port_318_r();
|
||||
|
||||
void map(address_map &map);
|
||||
|
||||
static void floppy_formats(format_registration &fr);
|
||||
};
|
||||
|
||||
|
@ -11,7 +11,7 @@ oricext_connector::oricext_connector(const machine_config &mconfig, const char *
|
||||
device_t(mconfig, ORICEXT_CONNECTOR, tag, owner, clock),
|
||||
device_single_card_slot_interface<device_oricext_interface>(mconfig, *this),
|
||||
irq_handler(*this),
|
||||
cpu(*this, finder_base::DUMMY_TAG)
|
||||
reset_handler(*this)
|
||||
{
|
||||
}
|
||||
|
||||
@ -22,6 +22,7 @@ oricext_connector::~oricext_connector()
|
||||
void oricext_connector::device_start()
|
||||
{
|
||||
irq_handler.resolve_safe();
|
||||
reset_handler.resolve_safe();
|
||||
}
|
||||
|
||||
void oricext_connector::irq_w(int state)
|
||||
@ -29,36 +30,42 @@ void oricext_connector::irq_w(int state)
|
||||
irq_handler(state);
|
||||
}
|
||||
|
||||
void oricext_connector::reset_w(int state)
|
||||
{
|
||||
reset_handler(state);
|
||||
}
|
||||
|
||||
void oricext_connector::set_view(memory_view &_view)
|
||||
{
|
||||
auto card = get_card_device();
|
||||
if(card)
|
||||
card->set_view(_view);
|
||||
}
|
||||
|
||||
void oricext_connector::map_io(address_space_installer &space)
|
||||
{
|
||||
auto card = get_card_device();
|
||||
if(card)
|
||||
card->map_io(space);
|
||||
}
|
||||
|
||||
void oricext_connector::map_rom()
|
||||
{
|
||||
auto card = get_card_device();
|
||||
if(card)
|
||||
card->map_rom();
|
||||
}
|
||||
|
||||
device_oricext_interface::device_oricext_interface(const machine_config &mconfig, device_t &device) :
|
||||
device_interface(device, "oricext"),
|
||||
cpu(nullptr),
|
||||
connector(nullptr),
|
||||
bank_c000_r(nullptr),
|
||||
bank_e000_r(nullptr),
|
||||
bank_f800_r(nullptr),
|
||||
bank_c000_w(nullptr),
|
||||
bank_e000_w(nullptr),
|
||||
bank_f800_w(nullptr),
|
||||
rom(nullptr),
|
||||
ram(nullptr)
|
||||
view(nullptr),
|
||||
connector(nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
void device_oricext_interface::interface_pre_start()
|
||||
{
|
||||
connector = downcast<oricext_connector *>(device().owner());
|
||||
cpu = connector->cpu.target();
|
||||
bank_c000_r = device().membank(":bank_c000_r");
|
||||
bank_e000_r = device().membank(":bank_e000_r");
|
||||
bank_f800_r = device().membank(":bank_f800_r");
|
||||
bank_c000_w = device().membank(":bank_c000_w");
|
||||
bank_e000_w = device().membank(":bank_e000_w");
|
||||
bank_f800_w = device().membank(":bank_f800_w");
|
||||
rom = (uint8_t *)cpu->memregion(DEVICE_SELF)->base();
|
||||
ram = (uint8_t *)device().memshare(":ram")->ptr();
|
||||
|
||||
memset(junk_read, 0xff, sizeof(junk_read));
|
||||
memset(junk_write, 0x00, sizeof(junk_write));
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(device_oricext_interface::irq_w)
|
||||
@ -66,6 +73,16 @@ WRITE_LINE_MEMBER(device_oricext_interface::irq_w)
|
||||
connector->irq_w(state);
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(device_oricext_interface::reset_w)
|
||||
{
|
||||
connector->reset_w(state);
|
||||
}
|
||||
|
||||
void device_oricext_interface::set_view(memory_view &_view)
|
||||
{
|
||||
view = &_view;
|
||||
}
|
||||
|
||||
void oricext_intf(device_slot_interface &device)
|
||||
{
|
||||
device.option_add("jasmin", ORIC_JASMIN);
|
||||
|
@ -20,46 +20,53 @@ class oricext_connector: public device_t, public device_single_card_slot_interfa
|
||||
friend class device_oricext_interface;
|
||||
|
||||
public:
|
||||
template <typename T, typename U>
|
||||
oricext_connector(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts, const char *dflt, U &&cputag)
|
||||
template <typename T>
|
||||
oricext_connector(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts, const char *dflt)
|
||||
: oricext_connector(mconfig, tag, owner, (uint32_t)0)
|
||||
{
|
||||
option_reset();
|
||||
opts(*this);
|
||||
set_default_option(dflt);
|
||||
set_fixed(false);
|
||||
set_cputag(std::forward<U>(cputag));
|
||||
}
|
||||
|
||||
oricext_connector(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
virtual ~oricext_connector();
|
||||
|
||||
template <typename T> void set_cputag(T &&tag) { cpu.set_tag(std::forward<T>(tag)); }
|
||||
auto irq_callback() { return irq_handler.bind(); }
|
||||
auto reset_callback() { return reset_handler.bind(); }
|
||||
|
||||
void irq_w(int state);
|
||||
void reset_w(int state);
|
||||
|
||||
void set_view(memory_view &view);
|
||||
void map_io(address_space_installer &space);
|
||||
void map_rom();
|
||||
|
||||
protected:
|
||||
virtual void device_start() override;
|
||||
|
||||
devcb_write_line irq_handler;
|
||||
required_device<m6502_device> cpu;
|
||||
devcb_write_line reset_handler;
|
||||
};
|
||||
|
||||
class device_oricext_interface : public device_interface
|
||||
{
|
||||
public:
|
||||
DECLARE_WRITE_LINE_MEMBER(irq_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(reset_w);
|
||||
|
||||
void set_view(memory_view &view);
|
||||
virtual void map_io(address_space_installer &space) = 0;
|
||||
virtual void map_rom() = 0;
|
||||
|
||||
protected:
|
||||
device_oricext_interface(const machine_config &mconfig, device_t &device);
|
||||
|
||||
virtual void interface_pre_start() override;
|
||||
|
||||
m6502_device *cpu;
|
||||
memory_view *view;
|
||||
oricext_connector *connector;
|
||||
memory_bank *bank_c000_r, *bank_e000_r, *bank_f800_r, *bank_c000_w, *bank_e000_w, *bank_f800_w;
|
||||
uint8_t *rom, *ram;
|
||||
uint8_t junk_read[8192], junk_write[8192];
|
||||
};
|
||||
|
||||
DECLARE_DEVICE_TYPE(ORICEXT_CONNECTOR, oricext_connector)
|
||||
|
@ -71,14 +71,10 @@ public:
|
||||
, m_via(*this, "via6522")
|
||||
, m_ram(*this, "ram")
|
||||
, m_rom(*this, "maincpu")
|
||||
, m_bank_c000_r(*this, "bank_c000_r")
|
||||
, m_bank_e000_r(*this, "bank_e000_r")
|
||||
, m_bank_f800_r(*this, "bank_f800_r")
|
||||
, m_bank_c000_w(*this, "bank_c000_w")
|
||||
, m_bank_e000_w(*this, "bank_e000_w")
|
||||
, m_bank_f800_w(*this, "bank_f800_w")
|
||||
, m_c000_view(*this, "c000")
|
||||
, m_config(*this, "CONFIG")
|
||||
, m_kbd_row(*this, "ROW%u", 0U)
|
||||
, m_ext(*this, "ext")
|
||||
, m_tape_timer(nullptr)
|
||||
{ }
|
||||
|
||||
@ -98,9 +94,11 @@ public:
|
||||
uint32_t screen_update_oric(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||
DECLARE_WRITE_LINE_MEMBER(vblank_w);
|
||||
|
||||
void oric(machine_config &config, bool add_ext = true);
|
||||
void oric_common(machine_config &config);
|
||||
void oric(machine_config &config);
|
||||
void prav8d(machine_config &config);
|
||||
void oric_mem(address_map &map);
|
||||
|
||||
protected:
|
||||
required_device<m6502_device> m_maincpu;
|
||||
required_device<palette_device> m_palette;
|
||||
@ -111,14 +109,10 @@ protected:
|
||||
required_device<via6522_device> m_via;
|
||||
required_shared_ptr<uint8_t> m_ram;
|
||||
optional_memory_region m_rom;
|
||||
required_memory_bank m_bank_c000_r;
|
||||
optional_memory_bank m_bank_e000_r;
|
||||
optional_memory_bank m_bank_f800_r;
|
||||
required_memory_bank m_bank_c000_w;
|
||||
optional_memory_bank m_bank_e000_w;
|
||||
optional_memory_bank m_bank_f800_w;
|
||||
memory_view m_c000_view;
|
||||
required_ioport m_config;
|
||||
required_ioport_array<8> m_kbd_row;
|
||||
optional_device<oricext_connector> m_ext;
|
||||
|
||||
emu_timer *m_tape_timer;
|
||||
|
||||
@ -188,14 +182,13 @@ protected:
|
||||
required_ioport m_joy2;
|
||||
|
||||
required_device_array<floppy_connector, 4> m_floppies;
|
||||
|
||||
uint8_t m_port_314;
|
||||
uint8_t m_via2_a, m_via2_b;
|
||||
bool m_via2_ca2, m_via2_cb2, m_via2_irq;
|
||||
bool m_acia_irq;
|
||||
bool m_fdc_irq, m_fdc_drq, m_fdc_hld;
|
||||
|
||||
uint8_t m_junk_read[0x4000], m_junk_write[0x4000];
|
||||
|
||||
virtual void update_irq() override;
|
||||
void remap();
|
||||
void port_314_w(u8 data);
|
||||
@ -206,11 +199,13 @@ protected:
|
||||
/* Ram is 64K, with 16K hidden by the rom. The 300-3ff is also hidden by the i/o */
|
||||
void oric_state::oric_mem(address_map &map)
|
||||
{
|
||||
map(0x0000, 0xffff).ram().share("ram");
|
||||
map(0x0000, 0xffff).ram().share(m_ram);
|
||||
map(0x0300, 0x030f).m(m_via, FUNC(via6522_device::map)).mirror(0xf0);
|
||||
map(0xc000, 0xdfff).bankr("bank_c000_r").bankw("bank_c000_w");
|
||||
map(0xe000, 0xf7ff).bankr("bank_e000_r").bankw("bank_e000_w");
|
||||
map(0xf800, 0xffff).bankr("bank_f800_r").bankw("bank_f800_w");
|
||||
map(0xc000, 0xffff).view(m_c000_view);
|
||||
m_c000_view[0](0xc000, 0xffff).rom().region(m_rom, 0);
|
||||
m_c000_view[0](0xc000, 0xffff).unmapw();
|
||||
m_c000_view[1]; // Ram range, ensure it exists
|
||||
m_c000_view[2]; // FDC rom range, ensure it exists
|
||||
}
|
||||
|
||||
/*
|
||||
@ -225,7 +220,24 @@ void telestrat_state::telestrat_mem(address_map &map)
|
||||
map(0x0318, 0x0318).r(FUNC(telestrat_state::port_318_r));
|
||||
map(0x031c, 0x031f).rw("acia", FUNC(mos6551_device::read), FUNC(mos6551_device::write));
|
||||
map(0x0320, 0x032f).m(m_via2, FUNC(via6522_device::map));
|
||||
map(0xc000, 0xffff).bankr("bank_c000_r").bankw("bank_c000_w");
|
||||
|
||||
// Theorically, these are cartridges. There's no real point to
|
||||
// making them configurable, when only 4 existed and there are 7
|
||||
// slots.
|
||||
|
||||
map(0xc000, 0xffff).view(m_c000_view);
|
||||
m_c000_view[0]; // Ram range, ensure it exists
|
||||
m_c000_view[1](0xc000, 0xffff).unmaprw(); // Nothing in that slot
|
||||
m_c000_view[2](0xc000, 0xffff).unmaprw(); // Nothing in that slot
|
||||
m_c000_view[3](0xc000, 0xffff).unmaprw(); // Nothing in that slot
|
||||
m_c000_view[4](0xc000, 0xffff).rom().region(m_telmatic, 0);
|
||||
m_c000_view[4](0xc000, 0xffff).unmapw();
|
||||
m_c000_view[5](0xc000, 0xffff).rom().region(m_teleass, 0);
|
||||
m_c000_view[5](0xc000, 0xffff).unmapw();
|
||||
m_c000_view[6](0xc000, 0xffff).rom().region(m_hyperbas, 0);
|
||||
m_c000_view[6](0xc000, 0xffff).unmapw();
|
||||
m_c000_view[7](0xc000, 0xffff).rom().region(m_telmon24, 0);
|
||||
m_c000_view[7](0xc000, 0xffff).unmapw();
|
||||
}
|
||||
|
||||
uint32_t oric_state::screen_update_oric(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
||||
@ -406,7 +418,7 @@ void oric_state::machine_start_common()
|
||||
m_via_irq = false;
|
||||
m_ext_irq = false;
|
||||
|
||||
if (!m_tape_timer)
|
||||
if(!m_tape_timer)
|
||||
m_tape_timer = timer_alloc(FUNC(oric_state::update_tape), this);
|
||||
|
||||
save_item(NAME(m_blink_counter));
|
||||
@ -423,13 +435,17 @@ void oric_state::machine_start_common()
|
||||
void oric_state::machine_start()
|
||||
{
|
||||
machine_start_common();
|
||||
m_bank_c000_r->set_base(m_rom->base());
|
||||
m_bank_e000_r->set_base(m_rom->base() + 0x2000);
|
||||
m_bank_f800_r->set_base(m_rom->base() + 0x3800);
|
||||
|
||||
m_c000_view.select(0);
|
||||
m_ext->set_view(m_c000_view);
|
||||
m_ext->map_io(m_maincpu->space(AS_PROGRAM));
|
||||
m_ext->map_rom();
|
||||
}
|
||||
|
||||
void oric_state::machine_reset()
|
||||
{
|
||||
m_ram[0xe000] = 0x42; // Microdisc needs a non-fully-zero high ram
|
||||
|
||||
m_tape_timer->adjust(attotime::from_hz(4800), 0, attotime::from_hz(4800));
|
||||
}
|
||||
|
||||
@ -439,9 +455,6 @@ void telestrat_state::machine_start()
|
||||
m_fdc_irq = m_fdc_drq = m_fdc_hld = false;
|
||||
m_acia_irq = false;
|
||||
|
||||
memset(m_junk_read, 0x00, sizeof(m_junk_read));
|
||||
memset(m_junk_write, 0x00, sizeof(m_junk_write));
|
||||
|
||||
save_item(NAME(m_port_314));
|
||||
save_item(NAME(m_via2_a));
|
||||
save_item(NAME(m_via2_b));
|
||||
@ -459,7 +472,7 @@ void telestrat_state::machine_reset()
|
||||
m_tape_timer->adjust(attotime::from_hz(4800), 0, attotime::from_hz(4800));
|
||||
m_port_314 = 0x00;
|
||||
m_via2_a = 0xff;
|
||||
remap();
|
||||
m_c000_view.select(7);
|
||||
}
|
||||
|
||||
void telestrat_state::update_irq()
|
||||
@ -475,7 +488,7 @@ void telestrat_state::update_irq()
|
||||
void telestrat_state::via2_a_w(uint8_t data)
|
||||
{
|
||||
m_via2_a = data;
|
||||
remap();
|
||||
m_c000_view.select(data & 7);
|
||||
}
|
||||
|
||||
void telestrat_state::via2_b_w(uint8_t data)
|
||||
@ -552,43 +565,6 @@ WRITE_LINE_MEMBER(telestrat_state::fdc_hld_w)
|
||||
m_fdc_hld = state;
|
||||
}
|
||||
|
||||
void telestrat_state::remap()
|
||||
{
|
||||
// Theorically, these are cartridges. There's no real point to
|
||||
// making them configurable, when only 4 existed and there are 7
|
||||
// slots.
|
||||
|
||||
switch(m_via2_a & 7) {
|
||||
case 0:
|
||||
m_bank_c000_r->set_base(m_ram+0xc000);
|
||||
m_bank_c000_w->set_base(m_ram+0xc000);
|
||||
break;
|
||||
case 1:
|
||||
case 2:
|
||||
case 3:
|
||||
m_bank_c000_r->set_base(m_junk_read);
|
||||
m_bank_c000_w->set_base(m_junk_write);
|
||||
break;
|
||||
case 4:
|
||||
m_bank_c000_r->set_base(m_telmatic->base());
|
||||
m_bank_c000_w->set_base(m_junk_write);
|
||||
break;
|
||||
case 5:
|
||||
m_bank_c000_r->set_base(m_teleass->base());
|
||||
m_bank_c000_w->set_base(m_junk_write);
|
||||
break;
|
||||
case 6:
|
||||
m_bank_c000_r->set_base(m_hyperbas->base());
|
||||
m_bank_c000_w->set_base(m_junk_write);
|
||||
break;
|
||||
case 7:
|
||||
m_bank_c000_r->set_base(m_telmon24->base());
|
||||
m_bank_c000_w->set_base(m_junk_write);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
static INPUT_PORTS_START(oric)
|
||||
PORT_START("ROW0")
|
||||
@ -806,7 +782,7 @@ static INPUT_PORTS_START(telstrat)
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
void oric_state::oric(machine_config &config, bool add_ext) // this variable not used
|
||||
void oric_state::oric_common(machine_config &config)
|
||||
{
|
||||
/* basic machine hardware */
|
||||
M6502(config, m_maincpu, 12_MHz_XTAL / 12);
|
||||
@ -853,14 +829,21 @@ void oric_state::oric(machine_config &config, bool add_ext) // this variable not
|
||||
m_via->ca2_handler().set(FUNC(oric_state::via_ca2_w));
|
||||
m_via->cb2_handler().set(FUNC(oric_state::via_cb2_w));
|
||||
m_via->irq_handler().set(FUNC(oric_state::via_irq_w));
|
||||
}
|
||||
|
||||
void oric_state::oric(machine_config &config)
|
||||
{
|
||||
oric_common(config);
|
||||
|
||||
/* extension port */
|
||||
ORICEXT_CONNECTOR(config, "ext", oricext_intf, nullptr, "maincpu").irq_callback().set(FUNC(oric_state::ext_irq_w));
|
||||
ORICEXT_CONNECTOR(config, m_ext, oricext_intf, nullptr);
|
||||
m_ext->irq_callback().set(FUNC(oric_state::ext_irq_w));
|
||||
m_ext->reset_callback().set_inputline(m_maincpu, INPUT_LINE_RESET);
|
||||
}
|
||||
|
||||
void oric_state::prav8d(machine_config &config)
|
||||
{
|
||||
oric(config, true);
|
||||
oric(config);
|
||||
}
|
||||
|
||||
void telestrat_state::floppy_formats(format_registration &fr)
|
||||
@ -876,7 +859,7 @@ static void telestrat_floppies(device_slot_interface &device)
|
||||
|
||||
void telestrat_state::telstrat(machine_config &config)
|
||||
{
|
||||
oric(config, false);
|
||||
oric(config);
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &telestrat_state::telestrat_mem);
|
||||
|
||||
/* acia */
|
||||
|
Loading…
Reference in New Issue
Block a user