1 // license:BSD-3-Clause
2 // copyright-holders:Olivier Galibert
3 #include "emu.h"
4 #include "jasmin.h"
5 #include "formats/oric_dsk.h"
6
7 DEFINE_DEVICE_TYPE(ORIC_JASMIN, oric_jasmin_device, "oric_jasmin", "Jasmin floppy drive interface")
8
ROM_START(jasmin)9 ROM_START( jasmin )
10 ROM_REGION( 0x800, "jasmin", 0 )
11 ROM_LOAD("jasmin.rom", 0, 0x800, CRC(37220e89) SHA1(70e59b8abd67092f050462abc6cb5271e4c15f01) )
12 ROM_END
13
14 FLOPPY_FORMATS_MEMBER( oric_jasmin_device::floppy_formats )
15 FLOPPY_ORIC_DSK_FORMAT
16 FLOPPY_FORMATS_END
17
18 static void jasmin_floppies(device_slot_interface &device)
19 {
20 device.option_add("3dsdd", FLOPPY_3_DSDD);
21 }
22
23 INPUT_PORTS_START( jasmin )
24 PORT_START("JASMIN")
PORT_CODE(KEYCODE_F1)25 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Boot") PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1)) PORT_CHANGED_MEMBER(DEVICE_SELF, oric_jasmin_device, boot_pressed, 0)
26 INPUT_PORTS_END
27
28 void oric_jasmin_device::map(address_map &map)
29 {
30 map(0x3f4, 0x3f7).rw("fdc", FUNC(wd1770_device::read), FUNC(wd1770_device::write));
31 map(0x3f8, 0x3ff).w(m_fdlatch, FUNC(ls259_device::write_d0));
32 }
33
oric_jasmin_device(const machine_config & mconfig,const char * tag,device_t * owner,uint32_t clock)34 oric_jasmin_device::oric_jasmin_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
35 device_t(mconfig, ORIC_JASMIN, tag, owner, clock),
36 device_oricext_interface(mconfig, *this),
37 m_fdc(*this, "fdc"),
38 m_fdlatch(*this, "fdlatch"),
39 m_floppies(*this, "fdc:%u", 0U),
40 m_jasmin_rom(*this, "jasmin"),
41 m_cur_floppy(nullptr)
42 {
43 }
44
~oric_jasmin_device()45 oric_jasmin_device::~oric_jasmin_device()
46 {
47 }
48
device_start()49 void oric_jasmin_device::device_start()
50 {
51 cpu->space(AS_PROGRAM).install_device(0x0000, 0xffff, *this, &oric_jasmin_device::map);
52 }
53
device_rom_region() const54 const tiny_rom_entry *oric_jasmin_device::device_rom_region() const
55 {
56 return ROM_NAME( jasmin );
57 }
58
device_add_mconfig(machine_config & config)59 void oric_jasmin_device::device_add_mconfig(machine_config &config)
60 {
61 WD1770(config, m_fdc, 8_MHz_XTAL);
62 m_fdc->drq_wr_callback().set(FUNC(oric_jasmin_device::irq_w));
63
64 FLOPPY_CONNECTOR(config, "fdc:0", jasmin_floppies, "3dsdd", oric_jasmin_device::floppy_formats);
65 FLOPPY_CONNECTOR(config, "fdc:1", jasmin_floppies, nullptr, oric_jasmin_device::floppy_formats);
66 FLOPPY_CONNECTOR(config, "fdc:2", jasmin_floppies, nullptr, oric_jasmin_device::floppy_formats);
67 FLOPPY_CONNECTOR(config, "fdc:3", jasmin_floppies, nullptr, oric_jasmin_device::floppy_formats);
68
69 LS259(config, m_fdlatch); // U14
70 m_fdlatch->q_out_cb<0>().set(FUNC(oric_jasmin_device::side_sel_w));
71 m_fdlatch->q_out_cb<1>().set(m_fdc, FUNC(wd1770_device::mr_w));
72 m_fdlatch->q_out_cb<2>().set(FUNC(oric_jasmin_device::ram_access_w));
73 m_fdlatch->q_out_cb<3>().set(FUNC(oric_jasmin_device::rom_access_w));
74 m_fdlatch->q_out_cb<4>().set(FUNC(oric_jasmin_device::select_w));
75 m_fdlatch->q_out_cb<5>().set(FUNC(oric_jasmin_device::select_w));
76 m_fdlatch->q_out_cb<6>().set(FUNC(oric_jasmin_device::select_w));
77 m_fdlatch->q_out_cb<7>().set(FUNC(oric_jasmin_device::select_w));
78 }
79
device_input_ports() const80 ioport_constructor oric_jasmin_device::device_input_ports() const
81 {
82 return INPUT_PORTS_NAME( jasmin );
83 }
84
remap()85 void oric_jasmin_device::remap()
86 {
87 if(m_fdlatch->q3_r()) {
88 if(m_fdlatch->q2_r()) {
89 bank_c000_r->set_base(ram+0xc000);
90 bank_e000_r->set_base(ram+0xe000);
91 bank_f800_r->set_base(m_jasmin_rom.target());
92 bank_c000_w->set_base(ram+0xc000);
93 bank_e000_w->set_base(ram+0xe000);
94 bank_f800_w->set_base(junk_write);
95 } else {
96 bank_c000_r->set_base(junk_read);
97 bank_e000_r->set_base(junk_read);
98 bank_f800_r->set_base(m_jasmin_rom.target());
99 bank_c000_w->set_base(junk_write);
100 bank_e000_w->set_base(junk_write);
101 bank_f800_w->set_base(junk_write);
102 }
103 } else {
104 if(m_fdlatch->q2_r()) {
105 bank_c000_r->set_base(ram+0xc000);
106 bank_e000_r->set_base(ram+0xe000);
107 bank_f800_r->set_base(ram+0xf800);
108 bank_c000_w->set_base(ram+0xc000);
109 bank_e000_w->set_base(ram+0xe000);
110 bank_f800_w->set_base(ram+0xf800);
111 } else {
112 bank_c000_r->set_base(rom+0x0000);
113 bank_e000_r->set_base(rom+0x2000);
114 bank_f800_r->set_base(rom+0x3800);
115 bank_c000_w->set_base(junk_write);
116 bank_e000_w->set_base(junk_write);
117 bank_f800_w->set_base(junk_write);
118 }
119 }
120 }
121
INPUT_CHANGED_MEMBER(oric_jasmin_device::boot_pressed)122 INPUT_CHANGED_MEMBER(oric_jasmin_device::boot_pressed)
123 {
124 if(newval) {
125 m_fdlatch->write_bit(3, 1);
126 cpu->reset();
127 }
128 }
129
WRITE_LINE_MEMBER(oric_jasmin_device::side_sel_w)130 WRITE_LINE_MEMBER(oric_jasmin_device::side_sel_w)
131 {
132 if(m_cur_floppy)
133 m_cur_floppy->ss_w(state);
134 }
135
WRITE_LINE_MEMBER(oric_jasmin_device::ram_access_w)136 WRITE_LINE_MEMBER(oric_jasmin_device::ram_access_w)
137 {
138 remap();
139 }
140
WRITE_LINE_MEMBER(oric_jasmin_device::rom_access_w)141 WRITE_LINE_MEMBER(oric_jasmin_device::rom_access_w)
142 {
143 remap();
144 }
145
WRITE_LINE_MEMBER(oric_jasmin_device::select_w)146 WRITE_LINE_MEMBER(oric_jasmin_device::select_w)
147 {
148 m_cur_floppy = nullptr;
149 for(int i=0; i != 4; i++)
150 if(BIT(m_fdlatch->output_state(), 4+i)) {
151 m_cur_floppy = m_floppies[i]->get_device();
152 break;
153 }
154 m_fdc->set_floppy(m_cur_floppy);
155 }
156