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