Previous 199869 Revisions Next

r20452 Thursday 24th January, 2013 at 21:20:47 UTC by Wilbert Pol
(MESS) svi318.c: Cleanups (nw)
[src/mess/drivers]svi318.c
[src/mess/includes]svi318.h
[src/mess/machine]svi318.c

trunk/src/mess/machine/svi318.c
r20451r20452
1010#include "includes/svi318.h"
1111#include "cpu/z80/z80.h"
1212#include "video/tms9928a.h"
13#include "machine/i8255.h"
14#include "machine/ins8250.h"
1513#include "machine/wd17xx.h"
16#include "machine/ctronics.h"
1714#include "imagedev/flopdrv.h"
18#include "imagedev/cassette.h"
1915#include "formats/svi_cas.h"
20#include "sound/dac.h"
2116#include "sound/ay8910.h"
22#include "machine/ram.h"
2317
2418enum {
2519   SVI_INTERNAL    = 0,
r20451r20452
2923};
3024
3125
32static void svi318_set_banks(running_machine &machine);
33
34
3526/* Serial ports */
3627
3728WRITE_LINE_MEMBER(svi318_state::svi318_ins8250_interrupt)
3829{
3930   if (m_svi.bankLow != SVI_CART)
4031   {
41      machine().device("maincpu")->execute().set_input_line(0, (state ? HOLD_LINE : CLEAR_LINE));
32      m_maincpu->set_input_line(0, (state ? HOLD_LINE : CLEAR_LINE));
4233   }
4334}
4435#if 0
r20451r20452
147138{
148139   int data = 0x0f;
149140
150   if ((machine().device<cassette_image_device>(CASSETTE_TAG))->input() > 0.0038)
141   if (m_cassette->input() > 0.0038)
142   {
151143      data |= 0x80;
152   if (!svi318_cassette_present(machine(), 0))
144   }
145   if (!m_cassette->exists())
146   {
153147      data |= 0x40;
154   data |= machine().root_device().ioport("BUTTONS")->read() & 0x30;
148   }
149   data |= m_buttons->read() & 0x30;
155150
156151   return data;
157152}
r20451r20452
171166
172167READ8_MEMBER(svi318_state::svi318_ppi_port_b_r)
173168{
174   int row;
175   static const char *const keynames[] = {
176      "LINE0", "LINE1", "LINE2", "LINE3", "LINE4", "LINE5",
177      "LINE6", "LINE7", "LINE8", "LINE9", "LINE10"
178   };
169   switch (m_svi.keyboard_row)
170   {
171      case 0:  return m_line0->read();
172      case 1:  return m_line1->read();
173      case 2:  return m_line2->read();
174      case 3:  return m_line3->read();
175      case 4:  return m_line4->read();
176      case 5:  return m_line5->read();
177      case 6:  return m_line6->read();
178      case 7:  return m_line7->read();
179      case 8:  return m_line8->read();
180      case 9:  return m_line9->read();
181      case 10: return m_line10->read();
182   }
179183
180   row = m_svi.keyboard_row;
181   if (row <= 10)
182      return machine().root_device().ioport(keynames[row])->read();
183
184184   return 0xff;
185185}
186186
r20451r20452
204204   /* key click */
205205   val = (data & 0x80) ? 0x3e : 0;
206206   val += (data & 0x40) ? 0x3e : 0;
207   machine().device<dac_device>("dac")->write_signed8(val);
207   m_dac->write_signed8(val);
208208
209209   /* cassette motor on/off */
210   if (svi318_cassette_present(machine(), 0))
210   if (m_cassette->exists())
211211   {
212         machine().device<cassette_image_device>(CASSETTE_TAG)->change_state(
212         m_cassette->change_state(
213213         (data & 0x10) ? CASSETTE_MOTOR_DISABLED : CASSETTE_MOTOR_ENABLED,
214214         CASSETTE_MOTOR_DISABLED);
215215   }
216216
217217   /* cassette signal write */
218   machine().device<cassette_image_device>(CASSETTE_TAG)->output((data & 0x20) ? -1.0 : +1.0);
218   m_cassette->output((data & 0x20) ? -1.0 : +1.0);
219219
220220   m_svi.keyboard_row = data & 0x0F;
221221}
r20451r20452
232232
233233WRITE8_MEMBER(svi318_state::svi318_ppi_w)
234234{
235   i8255_device *ppi = machine().device<i8255_device>("ppi8255");
236   ppi->write(space, offset + 2, data);
235   m_ppi->write(space, offset + 2, data);
237236}
238237
239238
r20451r20452
254253
255254READ8_MEMBER(svi318_state::svi318_psg_port_a_r)
256255{
257   return ioport("JOYSTICKS")->read();
256   return m_joysticks->read();
258257}
259258
260259/*
r20451r20452
279278      set_led_status (machine(), 0, !(data & 0x20) );
280279
281280   m_svi.bank_switch = data;
282   svi318_set_banks(machine());
281   svi318_set_banks();
283282}
284283
285284/* Disk drives  */
r20451r20452
377376WRITE8_MEMBER(svi318_state::svi806_ram_enable_w)
378377{
379378   m_svi.svi806_ram_enabled = ( data & 0x01 );
380   svi318_set_banks(machine());
379   svi318_set_banks();
381380}
382381
383382VIDEO_START_MEMBER(svi318_state,svi328_806)
r20451r20452
390389
391390   svi318_80col_init(machine());
392391   m_svi.svi806_present = 1;
393   svi318_set_banks(machine());
392   svi318_set_banks();
394393
395394   /* Set SVI-806 80 column card palette */
396395   palette_set_color_rgb( machine(), TMS9928A_PALETTE_SIZE, 0, 0, 0 );     /* Monochrome black */
r20451r20452
524523DRIVER_INIT_MEMBER(svi318_state,svi318)
525524{
526525   /* z80 stuff */
527   z80_set_cycle_tables( machine().device("maincpu"), cc_op, cc_cb, cc_ed, cc_xy, cc_xycb, cc_ex );
526   z80_set_cycle_tables( m_maincpu, cc_op, cc_cb, cc_ed, cc_xy, cc_xycb, cc_ex );
528527
529528   memset(&m_svi, 0, sizeof (m_svi) );
530529
r20451r20452
533532      m_svi.svi318 = 1;
534533   }
535534
536   machine().device("maincpu")->execute().set_input_line_vector(0, 0xff);
535   m_maincpu->set_input_line_vector(0, 0xff);
537536
538537   /* memory */
539538   m_svi.empty_bank = auto_alloc_array(machine(), UINT8, 0x8000);
r20451r20452
574573   int drive;
575574
576575   m_svi.bank_switch = 0xff;
577   svi318_set_banks(machine());
576   svi318_set_banks();
578577
579578   for(drive=0;drive<2;drive++)
580579   {
r20451r20452
626625   }
627626}
628627
629static void svi318_set_banks(running_machine &machine)
628void svi318_state::svi318_set_banks()
630629{
631   svi318_state *state = machine.driver_data<svi318_state>();
632   const UINT8 v = state->m_svi.bank_switch;
633   UINT8 *ram = machine.device<ram_device>(RAM_TAG)->pointer();
634   UINT32 ram_size = machine.device<ram_device>(RAM_TAG)->size();
630   const UINT8 v = m_svi.bank_switch;
631   UINT8 *ram = m_ram->pointer();
632   UINT32 ram_size = m_ram->size();
635633
636   state->m_svi.bankLow = ( v & 1 ) ? ( ( v & 2 ) ? ( ( v & 8 ) ? SVI_INTERNAL : SVI_EXPRAM3 ) : SVI_EXPRAM2 ) : SVI_CART;
637   state->m_svi.bankHigh1 = ( v & 4 ) ? ( ( v & 16 ) ? SVI_INTERNAL : SVI_EXPRAM3 ) : SVI_EXPRAM2;
634   m_svi.bankLow = ( v & 1 ) ? ( ( v & 2 ) ? ( ( v & 8 ) ? SVI_INTERNAL : SVI_EXPRAM3 ) : SVI_EXPRAM2 ) : SVI_CART;
635   m_svi.bankHigh1 = ( v & 4 ) ? ( ( v & 16 ) ? SVI_INTERNAL : SVI_EXPRAM3 ) : SVI_EXPRAM2;
638636
639   state->m_svi.bankLow_ptr = state->m_svi.empty_bank;
640   state->m_svi.bankLow_read_only = 1;
637   m_svi.bankLow_ptr = m_svi.empty_bank;
638   m_svi.bankLow_read_only = 1;
641639
642   switch( state->m_svi.bankLow )
640   switch( m_svi.bankLow )
643641   {
644642   case SVI_INTERNAL:
645      state->m_svi.bankLow_ptr = state->memregion("maincpu")->base();
643      m_svi.bankLow_ptr = memregion("maincpu")->base();
646644      break;
647645   case SVI_CART:
648      if ( state->m_pcart )
646      if ( m_pcart )
649647      {
650         state->m_svi.bankLow_ptr = state->m_pcart;
648         m_svi.bankLow_ptr = m_pcart;
651649      }
652650      break;
653651   case SVI_EXPRAM2:
654652      if ( ram_size >= 64 * 1024 )
655653      {
656         state->m_svi.bankLow_ptr = ram + ram_size - 64 * 1024;
657         state->m_svi.bankLow_read_only = 0;
654         m_svi.bankLow_ptr = ram + ram_size - 64 * 1024;
655         m_svi.bankLow_read_only = 0;
658656      }
659657      break;
660658   case SVI_EXPRAM3:
661659      if ( ram_size > 128 * 1024 )
662660      {
663         state->m_svi.bankLow_ptr = ram + ram_size - 128 * 1024;
664         state->m_svi.bankLow_read_only = 0;
661         m_svi.bankLow_ptr = ram + ram_size - 128 * 1024;
662         m_svi.bankLow_read_only = 0;
665663      }
666664      break;
667665   }
668666
669   state->m_svi.bankHigh1_ptr = state->m_svi.bankHigh2_ptr = state->m_svi.empty_bank;
670   state->m_svi.bankHigh1_read_only = state->m_svi.bankHigh2_read_only = 1;
667   m_svi.bankHigh1_ptr = m_svi.bankHigh2_ptr = m_svi.empty_bank;
668   m_svi.bankHigh1_read_only = m_svi.bankHigh2_read_only = 1;
671669
672   switch( state->m_svi.bankHigh1 )
670   switch( m_svi.bankHigh1 )
673671   {
674672   case SVI_INTERNAL:
675673      if ( ram_size == 16 * 1024 )
676674      {
677         state->m_svi.bankHigh2_ptr = ram;
678         state->m_svi.bankHigh2_read_only = 0;
675         m_svi.bankHigh2_ptr = ram;
676         m_svi.bankHigh2_read_only = 0;
679677      }
680678      else
681679      {
682         state->m_svi.bankHigh1_ptr = ram;
683         state->m_svi.bankHigh1_read_only = 0;
684         state->m_svi.bankHigh2_ptr = ram + 0x4000;
685         state->m_svi.bankHigh2_read_only = 0;
680         m_svi.bankHigh1_ptr = ram;
681         m_svi.bankHigh1_read_only = 0;
682         m_svi.bankHigh2_ptr = ram + 0x4000;
683         m_svi.bankHigh2_read_only = 0;
686684      }
687685      break;
688686   case SVI_EXPRAM2:
689687      if ( ram_size > 64 * 1024 )
690688      {
691         state->m_svi.bankHigh1_ptr = ram + ram_size - 64 * 1024 + 32 * 1024;
692         state->m_svi.bankHigh1_read_only = 0;
693         state->m_svi.bankHigh2_ptr = ram + ram_size - 64 * 1024 + 48 * 1024;
694         state->m_svi.bankHigh2_read_only = 0;
689         m_svi.bankHigh1_ptr = ram + ram_size - 64 * 1024 + 32 * 1024;
690         m_svi.bankHigh1_read_only = 0;
691         m_svi.bankHigh2_ptr = ram + ram_size - 64 * 1024 + 48 * 1024;
692         m_svi.bankHigh2_read_only = 0;
695693      }
696694      break;
697695   case SVI_EXPRAM3:
698696      if ( ram_size > 128 * 1024 )
699697      {
700         state->m_svi.bankHigh1_ptr = ram + ram_size - 128 * 1024 + 32 * 1024;
701         state->m_svi.bankHigh1_read_only = 0;
702         state->m_svi.bankHigh2_ptr = ram + ram_size - 128 * 1024 + 48 * 1024;
703         state->m_svi.bankHigh2_read_only = 0;
698         m_svi.bankHigh1_ptr = ram + ram_size - 128 * 1024 + 32 * 1024;
699         m_svi.bankHigh1_read_only = 0;
700         m_svi.bankHigh2_ptr = ram + ram_size - 128 * 1024 + 48 * 1024;
701         m_svi.bankHigh2_read_only = 0;
704702      }
705703      break;
706704   }
707705
708706   /* Check for special CART based banking */
709   if ( state->m_svi.bankLow == SVI_CART && ( v & 0xc0 ) != 0xc0 )
707   if ( m_svi.bankLow == SVI_CART && ( v & 0xc0 ) != 0xc0 )
710708   {
711      state->m_svi.bankHigh1_ptr = state->m_svi.empty_bank;
712      state->m_svi.bankHigh1_read_only = 1;
713      state->m_svi.bankHigh2_ptr = state->m_svi.empty_bank;
714      state->m_svi.bankHigh2_read_only = 1;
715      if ( state->m_pcart && ! ( v & 0x80 ) )
709      m_svi.bankHigh1_ptr = m_svi.empty_bank;
710      m_svi.bankHigh1_read_only = 1;
711      m_svi.bankHigh2_ptr = m_svi.empty_bank;
712      m_svi.bankHigh2_read_only = 1;
713      if ( m_pcart && ! ( v & 0x80 ) )
716714      {
717         state->m_svi.bankHigh2_ptr = state->m_pcart + 0x4000;
715         m_svi.bankHigh2_ptr = m_pcart + 0x4000;
718716      }
719      if ( state->m_pcart && ! ( v & 0x40 ) )
717      if ( m_pcart && ! ( v & 0x40 ) )
720718      {
721         state->m_svi.bankHigh1_ptr = state->m_pcart;
719         m_svi.bankHigh1_ptr = m_pcart;
722720      }
723721   }
724722
725   state->membank("bank1")->set_base(state->m_svi.bankLow_ptr );
726   state->membank("bank2")->set_base(state->m_svi.bankHigh1_ptr );
727   state->membank("bank3")->set_base(state->m_svi.bankHigh2_ptr );
723   membank("bank1")->set_base(m_svi.bankLow_ptr );
724   membank("bank2")->set_base(m_svi.bankHigh1_ptr );
725   membank("bank3")->set_base(m_svi.bankHigh2_ptr );
728726
729727   /* SVI-806 80 column card specific banking */
730   if ( state->m_svi.svi806_present )
728   if ( m_svi.svi806_present )
731729   {
732      if ( state->m_svi.svi806_ram_enabled )
730      if ( m_svi.svi806_ram_enabled )
733731      {
734         state->membank("bank4")->set_base(state->m_svi.svi806_ram );
732         membank("bank4")->set_base(m_svi.svi806_ram );
735733      }
736734      else
737735      {
738         state->membank("bank4")->set_base(state->m_svi.bankHigh2_ptr + 0x3000 );
736         membank("bank4")->set_base(m_svi.bankHigh2_ptr + 0x3000 );
739737      }
740738   }
741739}
742740
743/* Cassette */
744
745int svi318_cassette_present(running_machine &machine, int id)
746{
747   device_image_interface *image = dynamic_cast<device_image_interface *>(machine.device<cassette_image_device>(CASSETTE_TAG));
748
749   if ( image == NULL )
750      return FALSE;
751   return image->exists();
752}
753
754741/* External I/O */
755742
756743READ8_MEMBER(svi318_state::svi318_io_ext_r)
757744{
758745   UINT8 data = 0xff;
759746   device_t *device;
760   ins8250_device *uart;
761   centronics_device *centronics = machine().device<centronics_device>("centronics");
762747
763748   if (m_svi.bankLow == SVI_CART)
764749   {
r20451r20452
768753   switch( offset )
769754   {
770755   case 0x12:
771      data = 0xfe | centronics->busy_r();
756      data = 0xfe | m_centronics->busy_r();
772757      break;
773758
774759   case 0x20:
r20451r20452
779764   case 0x25:
780765   case 0x26:
781766   case 0x27:
782      uart = machine().device<ins8250_device>("ins8250_0");
783      data = uart->ins8250_r(space, offset & 7);
767      data = m_ins8250_0->ins8250_r(space, offset & 7);
784768      break;
785769
786770   case 0x28:
r20451r20452
791775   case 0x2D:
792776   case 0x2E:
793777   case 0x2F:
794      uart = machine().device<ins8250_device>("ins8250_1");
795      data = uart->ins8250_r(space, offset & 7);
778      data = m_ins8250_1->ins8250_r(space, offset & 7);
796779      break;
797780
798781   case 0x30:
r20451r20452
826809WRITE8_MEMBER(svi318_state::svi318_io_ext_w)
827810{
828811   device_t *device;
829   ins8250_device *uart;
830   centronics_device *centronics = machine().device<centronics_device>("centronics");
831812
832813   if (m_svi.bankLow == SVI_CART)
833814   {
r20451r20452
837818   switch( offset )
838819   {
839820   case 0x10:
840      centronics->write(space, 0, data);
821      m_centronics->write(space, 0, data);
841822      break;
842823
843824   case 0x11:
844      centronics->strobe_w(BIT(data, 0));
825      m_centronics->strobe_w(BIT(data, 0));
845826      break;
846827
847828   case 0x20:
r20451r20452
852833   case 0x25:
853834   case 0x26:
854835   case 0x27:
855      uart = machine().device<ins8250_device>("ins8250_0");
856      uart->ins8250_w(space, offset & 7, data);
836      m_ins8250_0->ins8250_w(space, offset & 7, data);
857837      break;
858838
859839   case 0x28:
r20451r20452
864844   case 0x2D:
865845   case 0x2E:
866846   case 0x2F:
867      uart = machine().device<ins8250_device>("ins8250_1");
868      uart->ins8250_w(space, offset & 7, data);
847      m_ins8250_1->ins8250_w(space, offset & 7, data);
869848      break;
870849
871850   case 0x30:
trunk/src/mess/includes/svi318.h
r20451r20452
1212#include "machine/i8255.h"
1313#include "machine/ins8250.h"
1414#include "machine/wd17xx.h"
15#include "imagedev/cassette.h"
16#include "sound/dac.h"
17#include "machine/ram.h"
18#include "machine/ctronics.h"
1519
20
1621struct SVI_318
1722{
1823   /* general */
r20451r20452
5055{
5156public:
5257   svi318_state(const machine_config &mconfig, device_type type, const char *tag)
53      : driver_device(mconfig, type, tag) { }
58      : driver_device(mconfig, type, tag)
59      , m_maincpu(*this, "maincpu")
60      , m_cassette(*this, CASSETTE_TAG)
61      , m_dac(*this, "dac")
62      , m_ppi(*this, "ppi8255")
63      , m_ram(*this, RAM_TAG)
64      , m_centronics(*this, "centronics")
65      , m_ins8250_0(*this, "ins8250_0")
66      , m_ins8250_1(*this, "ins8250_1")
67      , m_line0(*this, "LINE0")
68      , m_line1(*this, "LINE1")
69      , m_line2(*this, "LINE2")
70      , m_line3(*this, "LINE3")
71      , m_line4(*this, "LINE4")
72      , m_line5(*this, "LINE5")
73      , m_line6(*this, "LINE6")
74      , m_line7(*this, "LINE7")
75      , m_line8(*this, "LINE8")
76      , m_line9(*this, "LINE9")
77      , m_line10(*this, "LINE10")
78      , m_joysticks(*this, "JOYSTICKS")
79      , m_buttons(*this, "BUTTONS")
80   { }
5481
5582   SVI_318 m_svi;
5683   UINT8 *m_pcart;
r20451r20452
82109   DECLARE_WRITE8_MEMBER(svi318_ppi_port_c_w);
83110   DECLARE_WRITE_LINE_MEMBER(svi_fdc_intrq_w);
84111   DECLARE_WRITE_LINE_MEMBER(svi_fdc_drq_w);
112
113protected:
114   required_device<cpu_device> m_maincpu;
115   required_device<cassette_image_device> m_cassette;
116   required_device<dac_device> m_dac;
117   required_device<i8255_device> m_ppi;
118   required_device<ram_device> m_ram;
119   required_device<centronics_device> m_centronics;
120   required_device<ins8250_device> m_ins8250_0;
121   required_device<ins8250_device> m_ins8250_1;
122   required_ioport m_line0;
123   required_ioport m_line1;
124   required_ioport m_line2;
125   required_ioport m_line3;
126   required_ioport m_line4;
127   required_ioport m_line5;
128   required_ioport m_line6;
129   required_ioport m_line7;
130   required_ioport m_line8;
131   required_ioport m_line9;
132   required_ioport m_line10;
133   required_ioport m_joysticks;
134   required_ioport m_buttons;
135
136   void svi318_set_banks();
85137};
86138
87139
trunk/src/mess/drivers/svi318.c
r20451r20452
262262
263263WRITE_LINE_MEMBER(svi318_state::vdp_interrupt)
264264{
265   machine().device("maincpu")->execute().set_input_line(0, (state ? HOLD_LINE : CLEAR_LINE));
265   m_maincpu->set_input_line(0, (state ? HOLD_LINE : CLEAR_LINE));
266266}
267267
268268static TMS9928A_INTERFACE(svi318_tms9928a_interface)

Previous 199869 Revisions Next


© 1997-2024 The MAME Team