Previous 199869 Revisions Next

r32258 Sunday 21st September, 2014 at 18:19:59 UTC by Fabio Priuli
second round of svi318.c cleanup (with some tagmap reduction too). nw.
[src/mess/includes]svi318.h
[src/mess/machine]svi318.c

trunk/src/mess/machine/svi318.c
r32257r32258
2727
2828WRITE_LINE_MEMBER(svi318_state::ins8250_interrupt)
2929{
30   if (m_svi.bankLow != SVI_CART)
31   {
30   if (m_bank_low != SVI_CART)
3231      m_maincpu->set_input_line(0, (state ? HOLD_LINE : CLEAR_LINE));
33   }
3432}
3533
3634#if 0
r32257r32258
116114
117115READ8_MEMBER(svi318_state::ppi_port_b_r)
118116{
119   if (m_svi.keyboard_row <= 10)
120      return m_line[m_svi.keyboard_row]->read();
117   if (m_keyboard_row <= 10)
118      return m_line[m_keyboard_row]->read();
121119   else
122120      return 0xff;
123121}
r32257r32258
155153   /* cassette signal write */
156154   m_cassette->output((data & 0x20) ? -1.0 : +1.0);
157155
158   m_svi.keyboard_row = data & 0x0f;
156   m_keyboard_row = data & 0x0f;
159157}
160158
161159WRITE8_MEMBER(svi318_state::ppi_w)
r32257r32258
202200
203201WRITE8_MEMBER(svi318_state::psg_port_b_w)
204202{
205   if ( (m_svi.bank_switch ^ data) & 0x20)
206      set_led_status (machine(), 0, !(data & 0x20) );
203   if ((m_bank_switch ^ data) & 0x20)
204      set_led_status(machine(), 0, !(data & 0x20));
207205
208   m_svi.bank_switch = data;
206   m_bank_switch = data;
209207   svi318_set_banks();
210208}
211209
r32257r32258
213211
214212WRITE_LINE_MEMBER(svi318_state::fdc_intrq_w)
215213{
216   m_fdc.irq = state;
214   m_irq = state;
217215}
218216
219217WRITE_LINE_MEMBER(svi318_state::fdc_drq_w)
220218{
221   m_fdc.drq = state;
219   m_drq = state;
222220}
223221
224222WRITE8_MEMBER(svi318_state::fdc_drive_motor_w)
r32257r32258
227225   {
228226   case 1:
229227      m_fd1793->set_drive(0);
230      m_fdc.driveselect = 0;
228      m_driveselect = 0;
231229      break;
232230   case 2:
233231      m_fd1793->set_drive(1);
234      m_fdc.driveselect = 1;
232      m_driveselect = 1;
235233      break;
236234   }
237235}
r32257r32258
246244{
247245   UINT8 result = 0;
248246
249   result |= m_fdc.drq << 6;
250   result |= m_fdc.irq << 7;
247   result |= m_drq << 6;
248   result |= m_irq << 7;
251249
252250   return result;
253251}
r32257r32258
258256
259257   for (int i = 0; i < x_count; i++)
260258   {
261      UINT8 data = m_svi.svi806_gfx[m_svi.svi806_ram->u8((ma + i) & 0x7ff) * 16 + ra];
259      UINT8 data = m_svi806_gfx[m_svi806_ram->u8((ma + i) & 0x7ff) * 16 + ra];
262260
263261      if (i == cursor_x)
264262      {
r32257r32258
279277{
280278   /* 2K RAM, but allocating 4KB to make banking easier */
281279   /* The upper 2KB will be set to FFs and will never be written to */
282   m_svi.svi806_ram = machine().memory().region_alloc("gfx2", 0x1000, 1, ENDIANNESS_LITTLE);
283   memset(m_svi.svi806_ram->base(), 0x00, 0x800);
284   memset(m_svi.svi806_ram->base() + 0x800, 0xff, 0x800);
285   m_svi.svi806_gfx = memregion("gfx1")->base();
280   m_svi806_ram = machine().memory().region_alloc("gfx2", 0x1000, 1, ENDIANNESS_LITTLE);
281   memset(m_svi806_ram->base(), 0x00, 0x800);
282   memset(m_svi806_ram->base() + 0x800, 0xff, 0x800);
283   m_svi806_gfx = memregion("gfx1")->base();
286284}
287285
288286
289287WRITE8_MEMBER(svi318_state::svi806_ram_enable_w)
290288{
291   m_svi.svi806_ram_enabled = (data & 0x01);
289   m_svi806_ram_enabled = (data & 0x01);
292290   svi318_set_banks();
293291}
294292
r32257r32258
301299   MACHINE_RESET_CALL_MEMBER(svi318);
302300
303301   svi318_80col_init();
304   m_svi.svi806_present = 1;
302   m_svi806_present = 1;
305303   svi318_set_banks();
306304
307305   /* Set SVI-806 80 column card palette */
r32257r32258
438436   /* z80 stuff */
439437   m_maincpu->z80_set_cycle_tables(cc_op, cc_cb, cc_ed, cc_xy, cc_xycb, cc_ex);
440438
441   memset(&m_svi, 0, sizeof(m_svi));
442
443   if (!strcmp(machine().system().name, "svi318") || !strcmp(machine().system().name, "svi318n"))
444      m_svi.svi318 = 1;
445
446439   m_maincpu->set_input_line_vector(0, 0xff);
447440
448441   /* memory */
449   m_svi.empty_bank = auto_alloc_array(machine(), UINT8, 0x8000);
450   memset(m_svi.empty_bank, 0xff, 0x8000);
442   m_empty_bank = auto_alloc_array(machine(), UINT8, 0x8000);
443   memset(m_empty_bank, 0xff, 0x8000);
444   
445   m_bank_low_ptr = m_empty_bank;
446   m_bank_high1_ptr = m_empty_bank;
447   m_bank_high2_ptr = m_empty_bank;
448   
451449}
452450
453451MACHINE_START_MEMBER(svi318_state, svi318_ntsc)
454452{
455453   astring region_tag;
456454   m_cart_rom = memregion(region_tag.cpy(m_cart->tag()).cat(GENERIC_ROM_REGION_TAG));
455   m_bios_rom = memregion("maincpu");
457456}
458457
459458MACHINE_START_MEMBER(svi318_state, svi318_pal)
460459{
461460   astring region_tag;
462461   m_cart_rom = memregion(region_tag.cpy(m_cart->tag()).cat(GENERIC_ROM_REGION_TAG));
462   m_bios_rom = memregion("maincpu");
463463}
464464
465465static void svi318_load_proc(device_image_interface &image)
r32257r32258
471471   switch (size)
472472   {
473473   case 172032:    /* SVI-328 SSDD */
474      state->m_fdc.heads[id] = 1;
474      state->m_heads[id] = 1;
475475      break;
476476   case 346112:    /* SVI-328 DSDD */
477      state->m_fdc.heads[id] = 2;
477      state->m_heads[id] = 2;
478478      break;
479479   case 348160:    /* SVI-728 DSDD CP/M */
480      state->m_fdc.heads[id] = 2;
480      state->m_heads[id] = 2;
481481      break;
482482   }
483483}
484484
485485MACHINE_RESET_MEMBER(svi318_state, svi318)
486{
487   m_svi.bank_switch = 0xff;
486{   
487   m_keyboard_row = 0;
488   m_centronics_busy = 0;
489   m_svi806_present = 0;
490   m_svi806_ram_enabled = 0;
491   m_driveselect = 0;
492   m_drq = 0;
493   m_irq = 0;
494
495   m_bank_low = 0;
496   m_bank_high = 0;
497   m_bank_low_read_only = 0;
498   m_bank_high1_read_only = 0;
499   m_bank_high2_read_only = 0;
500
501   m_bank_switch = 0xff;
488502   svi318_set_banks();
489503
490504   for (int drive = 0; drive < 2; drive++)
491   {
492505      floppy_get_device(machine(), drive)->floppy_install_load_proc(svi318_load_proc);
493   }
494506}
495507
496508/* Memory */
497509
498510WRITE8_MEMBER(svi318_state::writemem1)
499511{
500   if (m_svi.bankLow_read_only)
512   if (m_bank_low_read_only)
501513      return;
502514
503   m_svi.bankLow_ptr[offset] = data;
515   m_bank_low_ptr[offset] = data;
504516}
505517
506518WRITE8_MEMBER(svi318_state::writemem2)
507519{
508   if (m_svi.bankHigh1_read_only)
520   if (m_bank_high1_read_only)
509521      return;
510522
511   m_svi.bankHigh1_ptr[offset] = data;
523   m_bank_high1_ptr[offset] = data;
512524}
513525
514526WRITE8_MEMBER(svi318_state::writemem3)
515527{
516   if (m_svi.bankHigh2_read_only)
528   if (m_bank_high2_read_only)
517529      return;
518530
519   m_svi.bankHigh2_ptr[offset] = data;
531   m_bank_high2_ptr[offset] = data;
520532}
521533
522534WRITE8_MEMBER(svi318_state::writemem4)
523535{
524   if (m_svi.svi806_ram_enabled)
536   if (m_svi806_ram_enabled)
525537   {
526538      if (offset < 0x800)
527      {
528         m_svi.svi806_ram->u8(offset) = data;
529      }
539         m_svi806_ram->u8(offset) = data;
530540   }
531541   else
532542   {
533      if (m_svi.bankHigh2_read_only)
543      if (m_bank_high2_read_only)
534544         return;
535545
536      m_svi.bankHigh2_ptr[0x3000 + offset] = data;
546      m_bank_high2_ptr[0x3000 + offset] = data;
537547   }
538548}
539549
540550void svi318_state::svi318_set_banks()
541551{
542   const UINT8 v = m_svi.bank_switch;
552   const UINT8 v = m_bank_switch;
543553   UINT8 *ram = m_ram->pointer();
544554   UINT32 ram_size = m_ram->size();
545555
546   m_svi.bankLow = ( v & 1 ) ? ( ( v & 2 ) ? ( ( v & 8 ) ? SVI_INTERNAL : SVI_EXPRAM3 ) : SVI_EXPRAM2 ) : SVI_CART;
547   m_svi.bankHigh1 = ( v & 4 ) ? ( ( v & 16 ) ? SVI_INTERNAL : SVI_EXPRAM3 ) : SVI_EXPRAM2;
556   m_bank_low = (v & 1) ? ((v & 2) ? ((v & 8) ? SVI_INTERNAL : SVI_EXPRAM3) : SVI_EXPRAM2) : SVI_CART;
557   m_bank_high = (v & 4) ? ((v & 16) ? SVI_INTERNAL : SVI_EXPRAM3) : SVI_EXPRAM2;
548558
549   m_svi.bankLow_ptr = m_svi.empty_bank;
550   m_svi.bankLow_read_only = 1;
559   m_bank_low_ptr = m_empty_bank;
560   m_bank_low_read_only = 1;
551561
552   switch( m_svi.bankLow )
562   switch (m_bank_low)
553563   {
554564   case SVI_INTERNAL:
555      m_svi.bankLow_ptr = memregion("maincpu")->base();
565      m_bank_low_ptr = m_bios_rom->base();
556566      break;
557567   case SVI_CART:
558568      if (m_cart_rom)
559         m_svi.bankLow_ptr = m_cart_rom->base();
569         m_bank_low_ptr = m_cart_rom->base();
560570      break;
561571   case SVI_EXPRAM2:
562      if ( ram_size >= 64 * 1024 )
572      if (ram_size >= 64 * 1024)
563573      {
564         m_svi.bankLow_ptr = ram + ram_size - 64 * 1024;
565         m_svi.bankLow_read_only = 0;
574         m_bank_low_ptr = ram + ram_size - 64 * 1024;
575         m_bank_low_read_only = 0;
566576      }
567577      break;
568578   case SVI_EXPRAM3:
569      if ( ram_size > 128 * 1024 )
579      if (ram_size > 128 * 1024)
570580      {
571         m_svi.bankLow_ptr = ram + ram_size - 128 * 1024;
572         m_svi.bankLow_read_only = 0;
581         m_bank_low_ptr = ram + ram_size - 128 * 1024;
582         m_bank_low_read_only = 0;
573583      }
574584      break;
575585   }
576586
577   m_svi.bankHigh1_ptr = m_svi.bankHigh2_ptr = m_svi.empty_bank;
578   m_svi.bankHigh1_read_only = m_svi.bankHigh2_read_only = 1;
587   m_bank_high1_ptr = m_empty_bank;
588   m_bank_high1_read_only = 1;
589   m_bank_high2_ptr = m_empty_bank;
590   m_bank_high2_read_only = 1;
579591
580   switch( m_svi.bankHigh1 )
592   switch (m_bank_high)
581593   {
582594   case SVI_INTERNAL:
583      if ( ram_size == 16 * 1024 )
595      if (ram_size == 16 * 1024)
584596      {
585         m_svi.bankHigh2_ptr = ram;
586         m_svi.bankHigh2_read_only = 0;
597         m_bank_high2_ptr = ram;
598         m_bank_high2_read_only = 0;
587599      }
588600      else
589601      {
590         m_svi.bankHigh1_ptr = ram;
591         m_svi.bankHigh1_read_only = 0;
592         m_svi.bankHigh2_ptr = ram + 0x4000;
593         m_svi.bankHigh2_read_only = 0;
602         m_bank_high1_ptr = ram;
603         m_bank_high1_read_only = 0;
604         m_bank_high2_ptr = ram + 0x4000;
605         m_bank_high2_read_only = 0;
594606      }
595607      break;
596608   case SVI_EXPRAM2:
597      if ( ram_size > 64 * 1024 )
609      if (ram_size > 64 * 1024)
598610      {
599         m_svi.bankHigh1_ptr = ram + ram_size - 64 * 1024 + 32 * 1024;
600         m_svi.bankHigh1_read_only = 0;
601         m_svi.bankHigh2_ptr = ram + ram_size - 64 * 1024 + 48 * 1024;
602         m_svi.bankHigh2_read_only = 0;
611         m_bank_high1_ptr = ram + ram_size - 64 * 1024 + 32 * 1024;
612         m_bank_high1_read_only = 0;
613         m_bank_high2_ptr = ram + ram_size - 64 * 1024 + 48 * 1024;
614         m_bank_high2_read_only = 0;
603615      }
604616      break;
605617   case SVI_EXPRAM3:
606      if ( ram_size > 128 * 1024 )
618      if (ram_size > 128 * 1024)
607619      {
608         m_svi.bankHigh1_ptr = ram + ram_size - 128 * 1024 + 32 * 1024;
609         m_svi.bankHigh1_read_only = 0;
610         m_svi.bankHigh2_ptr = ram + ram_size - 128 * 1024 + 48 * 1024;
611         m_svi.bankHigh2_read_only = 0;
620         m_bank_high1_ptr = ram + ram_size - 128 * 1024 + 32 * 1024;
621         m_bank_high1_read_only = 0;
622         m_bank_high2_ptr = ram + ram_size - 128 * 1024 + 48 * 1024;
623         m_bank_high2_read_only = 0;
612624      }
613625      break;
614626   }
615627
616628   /* Check for special CART based banking */
617   if ( m_svi.bankLow == SVI_CART && ( v & 0xc0 ) != 0xc0 )
629   if (m_bank_low == SVI_CART && (v & 0xc0 ) != 0xc0)
618630   {
619      m_svi.bankHigh1_ptr = m_svi.empty_bank;
620      m_svi.bankHigh1_read_only = 1;
621      m_svi.bankHigh2_ptr = m_svi.empty_bank;
622      m_svi.bankHigh2_read_only = 1;
631      m_bank_high1_ptr = m_empty_bank;
632      m_bank_high1_read_only = 1;
633      m_bank_high2_ptr = m_empty_bank;
634      m_bank_high2_read_only = 1;
635
623636      if (m_cart_rom && !(v & 0x80))
624         m_svi.bankHigh2_ptr = m_cart_rom->base() + 0x4000;
637         m_bank_high2_ptr = m_cart_rom->base() + 0x4000;
625638      if (m_cart_rom && !(v & 0x40))
626         m_svi.bankHigh1_ptr = m_cart_rom->base();
639         m_bank_high1_ptr = m_cart_rom->base();
627640   }
628641
629   membank("bank1")->set_base(m_svi.bankLow_ptr);
630   membank("bank2")->set_base(m_svi.bankHigh1_ptr);
631   membank("bank3")->set_base(m_svi.bankHigh2_ptr);
642   m_bank1->set_base(m_bank_low_ptr);
643   m_bank2->set_base(m_bank_high1_ptr);
644   m_bank3->set_base(m_bank_high2_ptr);
632645
633646   /* SVI-806 80 column card specific banking */
634   if (m_svi.svi806_present)
647   if (m_svi806_present)
635648   {
636      if (m_svi.svi806_ram_enabled)
637      {
638         membank("bank4")->set_base(m_svi.svi806_ram);
639      }
649      if (m_svi806_ram_enabled)
650         m_bank4->set_base(m_svi806_ram);
640651      else
641      {
642         membank("bank4")->set_base(m_svi.bankHigh2_ptr + 0x3000);
643      }
652         m_bank4->set_base(m_bank_high2_ptr + 0x3000);
644653   }
645654}
646655
r32257r32258
653662
654663READ8_MEMBER(svi318_state::io_ext_r)
655664{
656   if (m_svi.bankLow == SVI_CART)
665   if (m_bank_low == SVI_CART)
657666      return 0xff;
658667
659668   switch (offset)
r32257r32258
705714
706715WRITE8_MEMBER(svi318_state::io_ext_w)
707716{
708   if (m_svi.bankLow == SVI_CART)
717   if (m_bank_low == SVI_CART)
709718      return;
710719
711720   switch (offset)
trunk/src/mess/includes/svi318.h
r32257r32258
2626#include "bus/generic/carts.h"
2727
2828
29struct SVI_318
30{
31   /* general */
32   UINT8   svi318;     /* Are we dealing with an SVI-318 or a SVI-328 model. 0 = 328, 1 = 318 */
33   /* memory */
34   UINT8   *empty_bank;
35   UINT8   bank_switch;
36   UINT8   bankLow;
37   UINT8   bankHigh1;
38   UINT8   *bankLow_ptr;
39   UINT8   bankLow_read_only;
40   UINT8   *bankHigh1_ptr;
41   UINT8   bankHigh1_read_only;
42   UINT8   *bankHigh2_ptr;
43   UINT8   bankHigh2_read_only;
44   /* keyboard */
45   UINT8   keyboard_row;
46   /* SVI-806 80 column card */
47   UINT8   svi806_present;
48   UINT8   svi806_ram_enabled;
49   memory_region   *svi806_ram;
50   UINT8   *svi806_gfx;
51};
52
53struct SVI318_FDC_STRUCT
54{
55   UINT8 driveselect;
56   int drq;
57   int irq;
58   UINT8 heads[2];
59};
60
61
6229class svi318_state : public driver_device
6330{
6431public:
r32257r32258
7946      m_line(*this, "LINE"),
8047      m_joysticks(*this, "JOYSTICKS"),
8148      m_buttons(*this, "BUTTONS"),
82      m_palette(*this, "palette")  { }
49      m_palette(*this, "palette"),
50      m_bank1(*this, "bank1"),
51      m_bank2(*this, "bank2"),
52      m_bank3(*this, "bank3"),
53      m_bank4(*this, "bank4")
54   { }
55   
56   // FDC
57   UINT8 m_driveselect;
58   int m_drq;
59   int m_irq;
60   UINT8 m_heads[2];
8361
84   SVI_318 m_svi;
85   int m_centronics_busy;
86   SVI318_FDC_STRUCT m_fdc;
8762   DECLARE_WRITE8_MEMBER(ppi_w);
8863   DECLARE_READ8_MEMBER(psg_port_a_r);
8964   DECLARE_WRITE8_MEMBER(psg_port_b_w);
r32257r32258
11691
11792   MC6845_UPDATE_ROW(crtc_update_row);
11893   memory_region *m_cart_rom;
94   memory_region *m_bios_rom;
11995   
96protected:
12097   required_device<z80_device> m_maincpu;
121protected:
12298   required_device<cassette_image_device> m_cassette;
12399   required_device<dac_device> m_dac;
124100   required_device<i8255_device> m_ppi;
r32257r32258
133109   required_ioport_array<11> m_line;
134110   required_ioport m_joysticks;
135111   required_ioport m_buttons;
136public:
137112   optional_device<palette_device> m_palette;
113
138114protected:
139115   void svi318_set_banks();
140116   void svi318_80col_init();
141117   void svi318_vdp_interrupt(int i);
118
119private:
120   
121   // memory banking
122   UINT8   m_bank_switch;
123   UINT8   m_bank_low;
124   UINT8   m_bank_high;
125   
126   UINT8   m_bank_low_read_only;
127   UINT8   m_bank_high1_read_only;
128   UINT8   m_bank_high2_read_only;
129   
130   UINT8   *m_empty_bank;
131   UINT8   *m_bank_low_ptr;
132   UINT8   *m_bank_high1_ptr;
133   UINT8   *m_bank_high2_ptr;
134   
135   // keyboard
136   UINT8   m_keyboard_row;
137   
138   // centronics
139   int m_centronics_busy;
140   
141   // SVI-806 80 column card
142   UINT8   m_svi806_present;
143   UINT8   m_svi806_ram_enabled;
144   memory_region   *m_svi806_ram;
145   UINT8   *m_svi806_gfx;
146
147   required_memory_bank m_bank1;
148   required_memory_bank m_bank2;
149   required_memory_bank m_bank3;
150   optional_memory_bank m_bank4;
142151};
143152
144153#endif /* SVI318_H_ */

Previous 199869 Revisions Next


© 1997-2024 The MAME Team