Previous 199869 Revisions Next

r41453 Thursday 29th October, 2015 at 15:59:21 UTC by Vasantha Crabb
osborne1: add 6850ACIA serial port (untested), use configured banking
[src/mame/drivers]osborne1.c
[src/mame/includes]osborne1.h
[src/mame/machine]osborne1.c

trunk/src/mame/drivers/osborne1.c
r249964r249965
4747***************************************************************************/
4848
4949#include "includes/osborne1.h"
50#include "bus/rs232/rs232.h"
5051
5152
5253#define MAIN_CLOCK  15974400
r249964r249965
167168   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
168169
169170   PORT_START("CNF")
171   PORT_CONFNAME(0x06, 0x00, "Serial Speed")
172   PORT_CONFSETTING(0x00, "300/1200")
173   PORT_CONFSETTING(0x02, "600/1200")
174   PORT_CONFSETTING(0x04, "1200/4800")
175   PORT_CONFSETTING(0x06, "2400/9600")
170176   PORT_CONFNAME(0x01, 0x00, "Video Output")
171177   PORT_CONFSETTING(0x00, "Standard")
172178   PORT_CONFSETTING(0x01, "SCREEN-PAC")
r249964r249965
235241   MCFG_PIA_CB2_HANDLER(DEVWRITELINE(IEEE488_TAG, ieee488_device, ren_w))
236242   MCFG_PIA_IRQA_HANDLER(WRITELINE(osborne1_state, ieee_pia_irq_a_func))
237243
238   MCFG_DEVICE_ADD( "pia_1", PIA6821, 0)
244   MCFG_DEVICE_ADD("pia_1", PIA6821, 0)
239245   MCFG_PIA_WRITEPA_HANDLER(WRITE8(osborne1_state, video_pia_port_a_w))
240246   MCFG_PIA_WRITEPB_HANDLER(WRITE8(osborne1_state, video_pia_port_b_w))
241247   MCFG_PIA_CB2_HANDLER(WRITELINE(osborne1_state, video_pia_out_cb2_dummy))
242248   MCFG_PIA_IRQA_HANDLER(WRITELINE(osborne1_state, video_pia_irq_a_func))
243249
250   MCFG_DEVICE_ADD("acia", ACIA6850, 0)
251   MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_txd))
252   MCFG_ACIA6850_RTS_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_rts))
253   MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(osborne1_state, serial_acia_irq_func))
254
255   MCFG_RS232_PORT_ADD("rs232", default_rs232_devices, NULL)
256   MCFG_RS232_RXD_HANDLER(DEVWRITELINE("acia", acia6850_device, write_rxd))
257   MCFG_RS232_DCD_HANDLER(DEVWRITELINE("acia", acia6850_device, write_dcd))
258   MCFG_RS232_CTS_HANDLER(DEVWRITELINE("acia", acia6850_device, write_cts))
259   MCFG_RS232_RI_HANDLER(DEVWRITELINE("pia_1", pia6821_device, ca2_w))
260
244261   MCFG_DEVICE_ADD("mb8877", MB8877, MAIN_CLOCK/16)
245262   MCFG_WD_FDC_FORCE_READY
246263   MCFG_FLOPPY_DRIVE_ADD("mb8877:0", osborne1_floppies, "525ssdd", floppy_image_device::default_floppy_formats)
r249964r249965
250267   MCFG_IEEE488_SRQ_CALLBACK(DEVWRITELINE("pia_0", pia6821_device, ca2_w))
251268   MCFG_SOFTWARE_LIST_ADD("flop_list","osborne1")
252269
253   /* internal ram */
270   // internal ram
254271   MCFG_RAM_ADD(RAM_TAG)
255   MCFG_RAM_DEFAULT_SIZE("68K")    /* 64KB Main RAM and 4Kbit video attribute RAM */
272   MCFG_RAM_DEFAULT_SIZE("68K")    // 64bB main RAM and 4kbit video attribute RAM
256273MACHINE_CONFIG_END
257274
258275
trunk/src/mame/includes/osborne1.h
r249964r249965
2424   enum
2525   {
2626      TIMER_VIDEO,
27      TIMER_ACIA_RXC_TXC,
2728      TIMER_SETUP
2829   };
2930
30   osborne1_state(const machine_config &mconfig, device_type type, const char *tag)
31      : driver_device(mconfig, type, tag),
31   osborne1_state(const machine_config &mconfig, device_type type, const char *tag) :
32      driver_device(mconfig, type, tag),
3233      m_maincpu(*this, "maincpu"),
3334      m_pia0(*this, "pia_0"),
3435      m_pia1(*this, "pia_1"),
36      m_acia(*this, "acia"),
3537      m_fdc(*this, "mb8877"),
3638      m_beep(*this, "beeper"),
3739      m_ram(*this, RAM_TAG),
3840      m_ieee(*this, IEEE488_TAG),
3941      m_floppy0(*this, "mb8877:0:525ssdd"),
4042      m_floppy1(*this, "mb8877:1:525ssdd"),
43      m_video_timer(NULL),
4144      m_keyb_row0(*this, "ROW0"),
4245      m_keyb_row1(*this, "ROW1"),
4346      m_keyb_row2(*this, "ROW2"),
r249964r249965
4851      m_keyb_row7(*this, "ROW7"),
4952      m_btn_reset(*this, "RESET"),
5053      m_cnf(*this, "CNF"),
54      m_region_maincpu(*this, "maincpu"),
5155      m_bank_0xxx(*this, "bank_0xxx"),
5256      m_bank_1xxx(*this, "bank_1xxx"),
5357      m_bank_fxxx(*this, "bank_fxxx"),
54      m_region_maincpu(*this, "maincpu") { }
58      m_acia_rxc_txc_timer(NULL)
59   { }
5560
56   virtual void video_start();
5761
58   UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
59
60   bitmap_ind16 m_bitmap;
61
62   required_device<cpu_device> m_maincpu;
63   required_device<pia6821_device> m_pia0;
64   required_device<pia6821_device> m_pia1;
65   required_device<mb8877_t> m_fdc;
66   required_device<beep_device> m_beep;
67   required_device<ram_device> m_ram;
68   required_device<ieee488_device> m_ieee;
69   required_device<floppy_image_device> m_floppy0;
70   required_device<floppy_image_device> m_floppy1;
71
7262   DECLARE_WRITE8_MEMBER(bank_0xxx_w);
7363   DECLARE_WRITE8_MEMBER(bank_1xxx_w);
7464   DECLARE_READ8_MEMBER(bank_2xxx_3xxx_r);
r249964r249965
8777   DECLARE_WRITE_LINE_MEMBER(video_pia_out_cb2_dummy);
8878   DECLARE_WRITE_LINE_MEMBER(video_pia_irq_a_func);
8979
80   DECLARE_WRITE_LINE_MEMBER(serial_acia_irq_func);
81
82   DECLARE_DRIVER_INIT(osborne1);
83   virtual void machine_reset();
84   virtual void video_start();
85   UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
86
87   TIMER_CALLBACK_MEMBER(video_callback);
88   TIMER_CALLBACK_MEMBER(setup_callback);
89
90   bitmap_ind16 m_bitmap;
91
92   required_device<cpu_device> m_maincpu;
93   required_device<pia6821_device> m_pia0;
94   required_device<pia6821_device> m_pia1;
95   required_device<acia6850_device> m_acia;
96   required_device<mb8877_t> m_fdc;
97   required_device<beep_device> m_beep;
98   required_device<ram_device> m_ram;
99   required_device<ieee488_device> m_ieee;
100   required_device<floppy_image_device> m_floppy0;
101   required_device<floppy_image_device> m_floppy1;
102
90103   /* video related */
91   UINT8   m_screen_pac;
92104   UINT8   m_resolution;
93105   UINT8   m_hc_left;
94106   UINT8   m_new_start_x;
r249964r249965
96108   emu_timer *m_video_timer;
97109   UINT8   *m_p_chargen;
98110   bool m_beep_state;
99   DECLARE_DRIVER_INIT(osborne1);
100   virtual void machine_reset();
101   TIMER_CALLBACK_MEMBER(osborne1_video_callback);
102   TIMER_CALLBACK_MEMBER(setup_osborne1);
103111
104112protected:
105   required_ioport m_keyb_row0;
106   required_ioport m_keyb_row1;
107   required_ioport m_keyb_row2;
108   required_ioport m_keyb_row3;
109   required_ioport m_keyb_row4;
110   required_ioport m_keyb_row5;
111   required_ioport m_keyb_row6;
112   required_ioport m_keyb_row7;
113   required_ioport m_btn_reset;
113   virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
114114
115   required_ioport m_cnf;
115   bool set_rom_mode(UINT8 value);
116   bool set_bit_9(UINT8 value);
117   void update_irq();
118   void update_acia_rxc_txc();
116119
117   required_memory_bank m_bank_0xxx;
118   required_memory_bank m_bank_1xxx;
119   required_memory_bank m_bank_fxxx;
120   // user inputs
121   required_ioport         m_keyb_row0;
122   required_ioport         m_keyb_row1;
123   required_ioport         m_keyb_row2;
124   required_ioport         m_keyb_row3;
125   required_ioport         m_keyb_row4;
126   required_ioport         m_keyb_row5;
127   required_ioport         m_keyb_row6;
128   required_ioport         m_keyb_row7;
129   required_ioport         m_btn_reset;
120130
121   required_memory_region m_region_maincpu;
131   // fake inputs for hardware configuration and things that need rewiring
132   required_ioport         m_cnf;
122133
134   // pieces of memory
135   required_memory_region  m_region_maincpu;
136   required_memory_bank    m_bank_0xxx;
137   required_memory_bank    m_bank_1xxx;
138   required_memory_bank    m_bank_fxxx;
139
140   // configuration (reloaded on reset)
141   UINT8       m_screen_pac;
142   UINT8       m_acia_rxc_txc_div;
143   UINT8       m_acia_rxc_txc_p_low;
144   UINT8       m_acia_rxc_txc_p_high;
145
123146   // bank switch control bits
124   UINT8   m_ub4a_q;
125   UINT8   m_ub6a_q;
126   UINT8   m_rom_mode;
127   UINT8   m_bit_9;
147   UINT8       m_ub4a_q;
148   UINT8       m_ub6a_q;
149   UINT8       m_rom_mode;
150   UINT8       m_bit_9;
128151
129   bool set_rom_mode(UINT8 value);
130   bool set_bit_9(UINT8 value);
131   void update_irq();
132
133   virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
152   // serial state
153   int         m_acia_irq_state;
154   int         m_acia_rxc_txc_state;
155   emu_timer   *m_acia_rxc_txc_timer;
134156};
135157
136158#endif /* OSBORNE1_H_ */
trunk/src/mame/machine/osborne1.c
r249964r249965
5555      data = m_pia0->read(space, offset & 0x03);
5656      break;
5757   case 0xA00: /* Serial */
58      if (offset & 0x01) data = m_acia->data_r(space, 0);
59      else data = m_acia->status_r(space, 0);
5860      break;
5961   case 0xC00: /* Video PIA */
6062      data = m_pia1->read(space, offset & 0x03);
r249964r249965
7779      if ((offset & 0x900) == 0x900) // IEEE488 PIA
7880         m_pia0->write(space, offset & 0x03, data);
7981      if ((offset & 0xA00) == 0xA00) // Serial
80         /* not implemented */;
82      {
83         if (offset & 0x01) m_acia->data_w(space, 0, data);
84         else m_acia->control_w(space, 0, data);
85      }
8186      if ((offset & 0xC00) == 0x400) // SCREEN-PAC
8287      {
8388         m_resolution = data & 0x01;
r249964r249965
195200}
196201
197202
198WRITE_LINE_MEMBER( osborne1_state::video_pia_out_cb2_dummy )
199{
200}
201
202203WRITE8_MEMBER( osborne1_state::video_pia_port_a_w )
203204{
204205   m_fdc->dden_w(BIT(data, 0));
r249964r249965
235236   //logerror("Video pia port b write: %02X\n", data );
236237}
237238
239WRITE_LINE_MEMBER( osborne1_state::video_pia_out_cb2_dummy )
240{
241}
242
238243WRITE_LINE_MEMBER( osborne1_state::video_pia_irq_a_func )
239244{
240245   update_irq();
241246}
242247
243248
244//static const struct aica6850_interface osborne1_6850_config =
245//{
246//  10, /* tx_clock */
247//  10, /* rx_clock */
248//  NULL,   /* rx_pin */
249//  NULL,   /* tx_pin */
250//  NULL,   /* cts_pin */
251//  NULL,   /* rts_pin */
252//  NULL,   /* dcd_pin */
253//  NULL    /* int_callback */
254//};
249WRITE_LINE_MEMBER( osborne1_state::serial_acia_irq_func )
250{
251   m_acia_irq_state = state;
252   update_irq();
253}
255254
256255
257void osborne1_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
256DRIVER_INIT_MEMBER( osborne1_state, osborne1 )
258257{
259   switch (id)
258   m_bank_0xxx->configure_entries(0, 1, m_ram->pointer(), 0);
259   m_bank_0xxx->configure_entries(1, 1, m_region_maincpu->base(), 0);
260   m_bank_1xxx->configure_entries(0, 1, m_ram->pointer() + 0x1000, 0);
261   m_bank_1xxx->configure_entries(1, 1, m_region_maincpu->base(), 0);
262   m_bank_fxxx->configure_entries(0, 1, m_ram->pointer() + 0xF000, 0);
263   m_bank_fxxx->configure_entries(1, 1, m_ram->pointer() + 0x10000, 0);
264
265   m_video_timer = timer_alloc(TIMER_VIDEO);
266   m_video_timer->adjust(machine().first_screen()->time_until_pos(1, 0));
267
268   m_acia_rxc_txc_timer = timer_alloc(TIMER_ACIA_RXC_TXC);
269
270   timer_set(attotime::zero, TIMER_SETUP);
271}
272
273void osborne1_state::machine_reset()
274{
275   // Refresh configuration
276   m_screen_pac = 0 != (m_cnf->read() & 0x01);
277   switch (m_cnf->read() & 0x06)
260278   {
261   case TIMER_VIDEO:
262      osborne1_video_callback(ptr, param);
279   case 0x00:
280      m_acia_rxc_txc_div      = 16;
281      m_acia_rxc_txc_p_low    = 23;
282      m_acia_rxc_txc_p_high   = 29;
263283      break;
264   case TIMER_SETUP:
265      setup_osborne1(ptr, param);
284   case 0x02:
285      m_acia_rxc_txc_div      = 16;
286      m_acia_rxc_txc_p_low    = 9;
287      m_acia_rxc_txc_p_high   = 15;
266288      break;
267   default:
268      assert_always(FALSE, "Unknown id in osborne1_state::device_timer");
289   case 0x04:
290      m_acia_rxc_txc_div      = 16;
291      m_acia_rxc_txc_p_low    = 5;
292      m_acia_rxc_txc_p_high   = 8;
293      break;
294   case 0x06:
295      m_acia_rxc_txc_div      = 8;
296      m_acia_rxc_txc_p_low    = 5;
297      m_acia_rxc_txc_p_high   = 8;
298      break;
269299   }
300
301   // Initialise memory configuration
302   m_rom_mode = 0;
303   m_bit_9 = 1;
304   set_rom_mode(1);
305   set_bit_9(0);
306
307   // Reset serial state
308   m_acia_irq_state = 0;
309   m_acia_rxc_txc_state = 0;
310   update_acia_rxc_txc();
311
312   m_resolution = 0;
313   m_hc_left = 0;
314   m_p_chargen = memregion( "chargen" )->base();
315
316   for (unsigned i = 0; i < 0x1000; i++)
317      m_ram->pointer()[0x10000 + i] |= 0x7F;
270318}
271319
320void osborne1_state::video_start()
321{
322   machine().first_screen()->register_screen_bitmap(m_bitmap);
323}
272324
273TIMER_CALLBACK_MEMBER(osborne1_state::osborne1_video_callback)
325UINT32 osborne1_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
274326{
327   copybitmap(bitmap, m_bitmap, 0, 0, 0, 0, cliprect);
328   return 0;
329}
330
331
332TIMER_CALLBACK_MEMBER(osborne1_state::video_callback)
333{
275334   int const y = machine().first_screen()->vpos();
276335   UINT8 ra = 0;
277336
r249964r249965
330389   m_video_timer->adjust(machine().first_screen()->time_until_pos(y + 1, 0));
331390}
332391
333TIMER_CALLBACK_MEMBER(osborne1_state::setup_osborne1)
392TIMER_CALLBACK_MEMBER(osborne1_state::setup_callback)
334393{
335394   m_beep->set_state( 0 );
336395   m_beep->set_frequency( 300 /* 60 * 240 / 2 */ );
337396   m_pia1->ca1_w(0);
338397}
339398
340void osborne1_state::machine_reset()
341{
342   // Initialize memory configuration
343   m_rom_mode = 0;
344   m_bit_9 = 1;
345   set_rom_mode(1);
346   set_bit_9(0);
347399
348   m_screen_pac = 0 != (m_cnf->read() & 0x01);
349   m_resolution = 0;
350   m_hc_left = 0;
351   m_p_chargen = memregion( "chargen" )->base();
352
353   memset(m_ram->pointer() + 0x10000, 0xFF, 0x1000);
354}
355
356
357DRIVER_INIT_MEMBER(osborne1_state,osborne1)
400void osborne1_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
358401{
359   /* Configure the 6850 ACIA */
360//  acia6850_config( 0, &osborne1_6850_config );
361   m_video_timer = timer_alloc(TIMER_VIDEO);
362   m_video_timer->adjust(machine().first_screen()->time_until_pos(1, 0));
363
364   timer_set(attotime::zero, TIMER_SETUP);
402   switch (id)
403   {
404   case TIMER_VIDEO:
405      video_callback(ptr, param);
406      break;
407   case TIMER_ACIA_RXC_TXC:
408      m_acia_rxc_txc_state = m_acia_rxc_txc_state ? 0 : 1;
409      update_acia_rxc_txc();
410      break;
411   case TIMER_SETUP:
412      setup_callback(ptr, param);
413      break;
414   default:
415      assert_always(FALSE, "Unknown id in osborne1_state::device_timer");
416   }
365417}
366418
367419
368void osborne1_state::video_start()
369{
370   machine().first_screen()->register_screen_bitmap(m_bitmap);
371}
372
373
374UINT32 osborne1_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
375{
376   copybitmap(bitmap, m_bitmap, 0, 0, 0, 0, cliprect);
377   return 0;
378}
379
380
381420bool osborne1_state::set_rom_mode(UINT8 value)
382421{
383422   if (value != m_rom_mode)
384423   {
385424      m_rom_mode = value;
386      if (m_rom_mode)
387      {
388         m_bank_0xxx->set_base(m_region_maincpu->base());
389         m_bank_1xxx->set_base(m_region_maincpu->base());
390      }
391      else
392      {
393         m_bank_0xxx->set_base(m_ram->pointer());
394         m_bank_1xxx->set_base(m_ram->pointer() + 0x1000);
395      }
425      m_bank_0xxx->set_entry(m_rom_mode);
426      m_bank_1xxx->set_entry(m_rom_mode);
396427      return true;
397428   }
398429   else
r249964r249965
406437   if (value != m_bit_9)
407438   {
408439      m_bit_9 = value;
409      m_bank_fxxx->set_base(m_ram->pointer() + (m_bit_9 ? 0x10000 : 0xF000));
440      m_bank_fxxx->set_entry(m_bit_9);
410441      return true;
411442   }
412443   else
r249964r249965
421452      m_maincpu->set_input_line_and_vector(INPUT_LINE_IRQ0, ASSERT_LINE, 0xF0);
422453   else if (m_pia1->irq_a_state())
423454      m_maincpu->set_input_line_and_vector(INPUT_LINE_IRQ0, ASSERT_LINE, 0xF8);
455   else if (m_acia_irq_state)
456      m_maincpu->set_input_line_and_vector(INPUT_LINE_IRQ0, ASSERT_LINE, 0xFC);
424457   else
425458      m_maincpu->set_input_line_and_vector(INPUT_LINE_IRQ0, CLEAR_LINE, 0xFE);
426459}
460
461void osborne1_state::update_acia_rxc_txc()
462{
463   m_acia->write_rxc(m_acia_rxc_txc_state);
464   m_acia->write_txc(m_acia_rxc_txc_state);
465   attoseconds_t const dividend = (ATTOSECONDS_PER_SECOND / 100) * (m_acia_rxc_txc_state ? m_acia_rxc_txc_p_high : m_acia_rxc_txc_p_low);
466   attoseconds_t const divisor = (15974400 / 100) / m_acia_rxc_txc_div;
467   m_acia_rxc_txc_timer->adjust(attotime(0, dividend / divisor));
468}


Previous 199869 Revisions Next


© 1997-2024 The MAME Team