Previous 15994 Revisions Next

r5083 Friday 26th June, 2009 at 02:39:07 UTC by Barry Rodewald
[FM77AV] Various MMR improvements, hooked up YM2203 IRQ, added basic 320x200 video mode support.
[src/mess/drivers]fm7.c
[src/mess/includes]fm7.h
[src/mess/video]fm7.c

src/mess/video/fm7.c
r5082r5083
1212
1313extern UINT8* fm7_video_ram;
1414extern emu_timer* fm7_subtimer;
15extern UINT8 fm7_type;
1516
1617/*
1718 * Main CPU: Sub-CPU interface (port 0xfd05)
r5082r5083
125126      return;
126127     
127128   offs = (offset & 0xc000) | ((offset + fm7_video.vram_offset) & 0x3fff);
128   if(fm7_video.vram_access != 0)
129//   if(fm7_video.vram_access != 0)
129130      fm7_video_ram[offs] = data;
130131}
131132
133// not pretty, but it should work.
134READ8_HANDLER( fm7_vram0_r )
135{
136   return fm7_vram_r(space,offset);
137}
138
139READ8_HANDLER( fm7_vram1_r )
140{
141   return fm7_vram_r(space,offset+0x1000);
142}
143
144READ8_HANDLER( fm7_vram2_r )
145{
146   return fm7_vram_r(space,offset+0x2000);
147}
148
149READ8_HANDLER( fm7_vram3_r )
150{
151   return fm7_vram_r(space,offset+0x3000);
152}
153
154READ8_HANDLER( fm7_vram4_r )
155{
156   return fm7_vram_r(space,offset+0x4000);
157}
158
159READ8_HANDLER( fm7_vram5_r )
160{
161   return fm7_vram_r(space,offset+0x5000);
162}
163
164READ8_HANDLER( fm7_vram6_r )
165{
166   return fm7_vram_r(space,offset+0x6000);
167}
168
169READ8_HANDLER( fm7_vram7_r )
170{
171   return fm7_vram_r(space,offset+0x7000);
172}
173
174READ8_HANDLER( fm7_vram8_r )
175{
176   return fm7_vram_r(space,offset+0x8000);
177}
178
179READ8_HANDLER( fm7_vram9_r )
180{
181   return fm7_vram_r(space,offset+0x9000);
182}
183
184READ8_HANDLER( fm7_vramA_r )
185{
186   return fm7_vram_r(space,offset+0xa000);
187}
188
189READ8_HANDLER( fm7_vramB_r )
190{
191   return fm7_vram_r(space,offset+0xb000);
192}
193
194WRITE8_HANDLER( fm7_vram0_w )
195{
196   fm7_vram_w(space,offset,data);
197}
198
199WRITE8_HANDLER( fm7_vram1_w )
200{
201   fm7_vram_w(space,offset+0x1000,data);
202}
203
204WRITE8_HANDLER( fm7_vram2_w )
205{
206   fm7_vram_w(space,offset+0x2000,data);
207}
208
209WRITE8_HANDLER( fm7_vram3_w )
210{
211   fm7_vram_w(space,offset+0x3000,data);
212}
213
214WRITE8_HANDLER( fm7_vram4_w )
215{
216   fm7_vram_w(space,offset+0x4000,data);
217}
218
219WRITE8_HANDLER( fm7_vram5_w )
220{
221   fm7_vram_w(space,offset+0x5000,data);
222}
223
224WRITE8_HANDLER( fm7_vram6_w )
225{
226   fm7_vram_w(space,offset+0x6000,data);
227}
228
229WRITE8_HANDLER( fm7_vram7_w )
230{
231   fm7_vram_w(space,offset+0x7000,data);
232}
233
234WRITE8_HANDLER( fm7_vram8_w )
235{
236   fm7_vram_w(space,offset+0x8000,data);
237}
238
239WRITE8_HANDLER( fm7_vram9_w )
240{
241   fm7_vram_w(space,offset+0x9000,data);
242}
243
244WRITE8_HANDLER( fm7_vramA_w )
245{
246   fm7_vram_w(space,offset+0xa000,data);
247}
248
249WRITE8_HANDLER( fm7_vramB_w )
250{
251   fm7_vram_w(space,offset+0xb000,data);
252}
253
132254/*
133255 *  Sub CPU: I/O port 0xd408
134256 *
r5082r5083
155277WRITE8_HANDLER( fm7_vram_offset_w )
156278{
157279   UINT16 new_offset = 0;
158   
280      
159281   switch(offset)
160282   {
161283      case 0:
162284         new_offset = (data << 8) | (fm7_video.vram_offset & 0x00ff);
163285         break;
164286      case 1:  // low 5 bits are used on FM-77AV and later only
165         new_offset = (fm7_video.vram_offset & 0xff00) | (data & 0xe0);
287         if(fm7_type == SYS_FM7)
288            new_offset = (fm7_video.vram_offset & 0xff00) | (data & 0xe0);
289         else
290         {
291            if(fm7_video.fine_offset != 0)
292               new_offset = (fm7_video.vram_offset & 0xff00) | (data & 0xff);
293            else
294               new_offset = (fm7_video.vram_offset & 0xff00) | (data & 0xe0);
295         }
166296         break;
167   }
168   
297   }   
169298   fm7_video.vram_offset = new_offset;
170299}
171300
r5082r5083
267396 *             bit 4 - busy(0)/ready(1)
268397 *             bit 2 - VSync status (1 if active?)
269398 *             bit 0 - RESET
399 *
400 *     On write: bits 1-0 - CGROM select (maps to 0xd800)
401 *               bit 2 - fine offset enable (enables OA4-OA0 bits in VRAM offset)
402 *             bit 5 - active VRAM page
403 *             bit 6 - display VRAM page
404 *             bit 7 - NMI mask register (1=mask)
270405 */
271406READ8_HANDLER( fm77av_video_flags_r )
272407{
r5082r5083
281416   return ret;
282417}
283418
419WRITE8_HANDLER( fm77av_video_flags_w )
420{
421   fm7_video.cgrom = data & 0x03;
422   fm7_video.fine_offset = data & 0x04;
423}
424
284425/*
285426 *  Main CPU: port 0xfd12
286427 *  Sub mode status register  (FM-77AV or later)
r5082r5083
302443
303444WRITE8_HANDLER( fm77av_sub_modestatus_w )
304445{
446   rectangle rect;
305447   fm7_video.modestatus = data & 0x40;
448   if(data & 0x40)
449   {
450      rect.min_x = rect.min_y = 0;
451      rect.max_x = 320-1;
452      rect.max_y = 200-1;
453      video_screen_configure(space->machine->primary_screen,320,200,&rect,HZ_TO_ATTOSECONDS(60));
454   }
455   else
456   {
457      rect.min_x = rect.min_y = 0;
458      rect.max_x = 640-1;
459      rect.max_y = 200-1;
460      video_screen_configure(space->machine->primary_screen,640,200,&rect,HZ_TO_ATTOSECONDS(60));
461   }
306462}
307463
308464/*
r5082r5083
314470 */
315471WRITE8_HANDLER( fm77av_sub_bank_w )
316472{
317   UINT8* RAM = memory_region(space->machine,"sub");
473//   UINT8* RAM = memory_region(space->machine,"sub");
318474   UINT8* ROM;
319475   
320476   fm7_video.subrom = data & 0x03;
r5082r5083
322478   {
323479      case 0x00:  // Type C, 640x200 (as used on the FM-7)
324480         ROM = memory_region(space->machine,"subsys_c");
325         memory_set_bankptr(space->machine,20,ROM);
481      //   memory_set_bankptr(space->machine,20,ROM);
326482         memory_set_bankptr(space->machine,21,ROM+0x800);
327483         logerror("VID: Sub ROM Type C selected\n");
328484         break;
329485      case 0x01:  // Type A, 640x200
330486         ROM = memory_region(space->machine,"subsys_a");
331         memory_set_bankptr(space->machine,20,RAM+0xd800);
487      //   memory_set_bankptr(space->machine,20,RAM+0xd800);
332488         memory_set_bankptr(space->machine,21,ROM);
333489         logerror("VID: Sub ROM Type A selected\n");
334490         break;
335491      case 0x02:  // Type B, 320x200
336492         ROM = memory_region(space->machine,"subsys_b");
337         memory_set_bankptr(space->machine,20,RAM+0xd800);
493      //   memory_set_bankptr(space->machine,20,RAM+0xd800);
338494         memory_set_bankptr(space->machine,21,ROM);
339495         logerror("VID: Sub ROM Type B selected\n");
340496         break;
341497      case 0x03:  // CG Font?
342498         ROM = memory_region(space->machine,"subsyscg");
343         memory_set_bankptr(space->machine,20,RAM+0xd800);
499      //   memory_set_bankptr(space->machine,20,RAM+0xd800);
344500         memory_set_bankptr(space->machine,21,ROM);
345501         logerror("VID: Sub ROM CG selected\n");
346502         break;
r5082r5083
358514   fm7_video.vram_offset = 0x0000;
359515   fm7_video.sub_reset = 0;
360516   fm7_video.multi_page = 0;
517   fm7_video.subrom = 0;
518   fm7_video.cgrom = 0;
519   fm7_video.fine_offset = 0;
361520}
362521
363522VIDEO_UPDATE( fm7 )
r5082r5083
369528   if(fm7_video.crt_enable == 0)
370529      return 0;
371530
372    for (y = 0; y < 200; y++)
373    {
374       for (x = 0; x < 80; x++)
531   if(fm7_video.modestatus & 0x40)  // 320x200 mode
532   {
533       for (y = 0; y < 200; y++)
375534       {
376          if(!(fm7_video.multi_page & 0x40))
377               code_r = fm7_video_ram[0x8000 + ((y*80 + x + fm7_video.vram_offset) & 0x3fff)];
378          if(!(fm7_video.multi_page & 0x20))
379               code_g = fm7_video_ram[0x4000 + ((y*80 + x + fm7_video.vram_offset) & 0x3fff)];
380          if(!(fm7_video.multi_page & 0x10))
381               code_b = fm7_video_ram[0x0000 + ((y*80 + x + fm7_video.vram_offset) & 0x3fff)];
382            for (b = 0; b < 8; b++)
383            {
384                col = (((code_r >> b) & 0x01) ? 4 : 0) + (((code_g >> b) & 0x01) ? 2 : 0) + (((code_b >> b) & 0x01) ? 1 : 0);
385                *BITMAP_ADDR16(bitmap, y,  x*8+(7-b)) =  col;
386            }
387        }
388    }
535          for (x = 0; x < 40; x++)
536          {
537             if(!(fm7_video.multi_page & 0x40))
538                  code_r = fm7_video_ram[0x4000 + ((y*40 + x + fm7_video.vram_offset) & 0x1fff)];
539             if(!(fm7_video.multi_page & 0x20))
540                  code_g = fm7_video_ram[0x2000 + ((y*40 + x + fm7_video.vram_offset) & 0x1fff)];
541             if(!(fm7_video.multi_page & 0x10))
542                  code_b = fm7_video_ram[0x0000 + ((y*40 + x + fm7_video.vram_offset) & 0x1fff)];
543               for (b = 0; b < 8; b++)
544               {
545                   col = (((code_r >> b) & 0x01) ? 4 : 0) + (((code_g >> b) & 0x01) ? 2 : 0) + (((code_b >> b) & 0x01) ? 1 : 0);
546                   *BITMAP_ADDR16(bitmap, y,  x*8+(7-b)) =  col;
547               }
548           }
549       }
550   }
551   else
552   {
553       for (y = 0; y < 200; y++)
554       {
555          for (x = 0; x < 80; x++)
556          {
557             if(!(fm7_video.multi_page & 0x40))
558                  code_r = fm7_video_ram[0x8000 + ((y*80 + x + fm7_video.vram_offset) & 0x3fff)];
559             if(!(fm7_video.multi_page & 0x20))
560                  code_g = fm7_video_ram[0x4000 + ((y*80 + x + fm7_video.vram_offset) & 0x3fff)];
561             if(!(fm7_video.multi_page & 0x10))
562                  code_b = fm7_video_ram[0x0000 + ((y*80 + x + fm7_video.vram_offset) & 0x3fff)];
563               for (b = 0; b < 8; b++)
564               {
565                   col = (((code_r >> b) & 0x01) ? 4 : 0) + (((code_g >> b) & 0x01) ? 2 : 0) + (((code_b >> b) & 0x01) ? 1 : 0);
566                   *BITMAP_ADDR16(bitmap, y,  x*8+(7-b)) =  col;
567               }
568           }
569       }
570   }
389571   return 0;
390572}
391573
src/mess/includes/fm7.h
r5082r5083
1111#define IRQ_FLAG_KEY      0x01
1212#define IRQ_FLAG_PRINTER  0x02
1313#define IRQ_FLAG_TIMER    0x04
14#define IRQ_FLAG_UNKNOWN  0x08
14#define IRQ_FLAG_OTHER    0x08
1515// the following are not read in port 0xfd03
1616#define IRQ_FLAG_MFD      0x10
1717#define IRQ_FLAG_TXRDY    0x20
r5082r5083
3838   UINT8 fm77av_pal_g[4096];
3939   UINT8 fm77av_pal_b[4096];
4040   UINT8 subrom;  // currently active sub CPU ROM (AV only)
41   UINT8 cgrom;  // currently active CGROM (AV only)
4142   UINT8 modestatus;
4243   UINT8 multi_page;
44   UINT8 fine_offset;
4345};
4446
45void fm7_mmr_refresh(running_machine*);
47void fm7_mmr_refresh(const address_space*);
4648
4749READ8_HANDLER( fm7_subintf_r );
4850WRITE8_HANDLER( fm7_subintf_w );
r5082r5083
6365WRITE8_HANDLER( fm7_crt_w );
6466WRITE8_HANDLER( fm7_vram_offset_w );
6567READ8_HANDLER( fm77av_video_flags_r );
68WRITE8_HANDLER( fm77av_video_flags_w );
6669
6770WRITE8_HANDLER( fm77av_analog_palette_w );
6871WRITE8_HANDLER( fm7_multipage_w );
6972READ8_HANDLER( fm7_palette_r );
7073WRITE8_HANDLER( fm7_palette_w );
7174
75READ8_HANDLER( fm7_vram0_r );
76READ8_HANDLER( fm7_vram1_r );
77READ8_HANDLER( fm7_vram2_r );
78READ8_HANDLER( fm7_vram3_r );
79READ8_HANDLER( fm7_vram4_r );
80READ8_HANDLER( fm7_vram5_r );
81READ8_HANDLER( fm7_vram6_r );
82READ8_HANDLER( fm7_vram7_r );
83READ8_HANDLER( fm7_vram8_r );
84READ8_HANDLER( fm7_vram9_r );
85READ8_HANDLER( fm7_vramA_r );
86READ8_HANDLER( fm7_vramB_r );
87WRITE8_HANDLER( fm7_vram0_w );
88WRITE8_HANDLER( fm7_vram1_w );
89WRITE8_HANDLER( fm7_vram2_w );
90WRITE8_HANDLER( fm7_vram3_w );
91WRITE8_HANDLER( fm7_vram4_w );
92WRITE8_HANDLER( fm7_vram5_w );
93WRITE8_HANDLER( fm7_vram6_w );
94WRITE8_HANDLER( fm7_vram7_w );
95WRITE8_HANDLER( fm7_vram8_w );
96WRITE8_HANDLER( fm7_vram9_w );
97WRITE8_HANDLER( fm7_vramA_w );
98WRITE8_HANDLER( fm7_vramB_w );
99
100
72101VIDEO_START( fm7 );
73102VIDEO_UPDATE( fm7 );
74103PALETTE_INIT( fm7 );
src/mess/drivers/fm7.c
r5082r5083
5252
5353UINT8* fm7_video_ram;
5454UINT8* shared_ram;
55UINT8* fm7_boot_ram;  // Boot RAM (AV only)
56UINT8 fm7_type;
5557static UINT8 irq_flags;  // active IRQ flags
5658static UINT8 irq_mask;  // IRQ mask
5759emu_timer* fm7_timer;  // main timer, triggered every 2.0345ms
r5082r5083
7072static UINT8 fdc_drive;
7173static UINT8 fdc_irq_flag;
7274static UINT8 fdc_drq_flag;
73static UINT8 fm7_type;
75static UINT8 fm77av_ym_irq;
7476
7577struct mmr
7678{
r5082r5083
283285   if(fm7_type == SYS_FM7)
284286      memory_set_bankptr(space->machine,1,RAM+0x38000);
285287   else
286      fm7_mmr_refresh(space->machine);
288      fm7_mmr_refresh(space);
287289   logerror("BASIC ROM enabled\n");
288290   return 0x00;
289291}
r5082r5083
296298   if(fm7_type == SYS_FM7)
297299      memory_set_bankptr(space->machine,1,RAM+0x8000);
298300   else
299      fm7_mmr_refresh(space->machine);
301      fm7_mmr_refresh(space);
300302   logerror("BASIC ROM disabled\n");
301303}
302304
r5082r5083
311313   if(data & 0x02)
312314   {
313315      init_rom_en = 0;
314      fm7_mmr_refresh(space->machine);
316      fm7_mmr_refresh(space);
315317   }
316318   else
317319   {
318320      init_rom_en = 1;
319      fm7_mmr_refresh(space->machine);
321      fm7_mmr_refresh(space);
320322   }
321323}
322324
r5082r5083
626628   return psg_data;
627629}
628630
631static WRITE8_HANDLER( fm77av_bootram_w )
632{
633   if(!(fm7_mmr.mode & 0x01))
634      return;
635   fm7_boot_ram[offset] = data;
636}
637
629638static WRITE8_HANDLER( fm7_psg_data_w )
630639{
631640   psg_data = data;
r5082r5083
647656      shared_ram[offset] = data;
648657}
649658
659static READ8_HANDLER( fm7_fmirq_r )
660{
661   UINT8 ret = 0xff;
662   
663   if(fm77av_ym_irq == 0)
664      ret &= ~0x08;
665     
666   return ret;
667}
668
650669static READ8_HANDLER( fm7_unknown_r )
651670{
652671   // Port 0xFDFC is read by Dig Dug.  Controller port, perhaps?
r5082r5083
681700   return 0xff;
682701}
683702
684static void fm7_update_bank(running_machine* machine, int bank, UINT8 physical)
703static void fm7_update_bank(const address_space* space, int bank, UINT8 physical)
685704{
686   UINT8* RAM = memory_region(machine,"maincpu");
705   UINT8* RAM = memory_region(space->machine,"maincpu");
706   UINT16 size = 0xfff;
687707   
688   if(physical > 0x10 && physical <= 0x1f)
708   if(bank == 15)
709      size = 0xbff;
710   
711   if(physical >= 0x10 && physical <= 0x1b)
689712   {
690      RAM = memory_region(machine,"sub");
691      memory_set_bankptr(machine,bank+1,RAM+(physical<<12)-0x10000);
713      switch(physical)
714      {
715         case 0x10:
716            memory_install_readwrite8_handler(space,bank*0x1000,(bank*0x1000)+size,0,0,fm7_vram0_r,fm7_vram0_w);
717            break;
718         case 0x11:
719            memory_install_readwrite8_handler(space,bank*0x1000,(bank*0x1000)+size,0,0,fm7_vram1_r,fm7_vram1_w);
720            break;
721         case 0x12:
722            memory_install_readwrite8_handler(space,bank*0x1000,(bank*0x1000)+size,0,0,fm7_vram2_r,fm7_vram2_w);
723            break;
724         case 0x13:
725            memory_install_readwrite8_handler(space,bank*0x1000,(bank*0x1000)+size,0,0,fm7_vram3_r,fm7_vram3_w);
726            break;
727         case 0x14:
728            memory_install_readwrite8_handler(space,bank*0x1000,(bank*0x1000)+size,0,0,fm7_vram4_r,fm7_vram4_w);
729            break;
730         case 0x15:
731            memory_install_readwrite8_handler(space,bank*0x1000,(bank*0x1000)+size,0,0,fm7_vram5_r,fm7_vram5_w);
732            break;
733         case 0x16:
734            memory_install_readwrite8_handler(space,bank*0x1000,(bank*0x1000)+size,0,0,fm7_vram6_r,fm7_vram6_w);
735            break;
736         case 0x17:
737            memory_install_readwrite8_handler(space,bank*0x1000,(bank*0x1000)+size,0,0,fm7_vram7_r,fm7_vram7_w);
738            break;
739         case 0x18:
740            memory_install_readwrite8_handler(space,bank*0x1000,(bank*0x1000)+size,0,0,fm7_vram8_r,fm7_vram8_w);
741            break;
742         case 0x19:
743            memory_install_readwrite8_handler(space,bank*0x1000,(bank*0x1000)+size,0,0,fm7_vram9_r,fm7_vram9_w);
744            break;
745         case 0x1a:
746            memory_install_readwrite8_handler(space,bank*0x1000,(bank*0x1000)+size,0,0,fm7_vramA_r,fm7_vramA_w);
747            break;
748         case 0x1b:
749            memory_install_readwrite8_handler(space,bank*0x1000,(bank*0x1000)+size,0,0,fm7_vramB_r,fm7_vramB_w);
750            break;
751      }
752//      memory_set_bankptr(space->machine,bank+1,RAM+(physical<<12)-0x10000);
753      return;
692754   }
755   if(physical == 0x1d)
756   {
757      // special case - the sub CPU's I/O ports are available on this RAM page
758      // work RAM
759      memory_install_readwrite8_handler(space,bank*0x1000,(bank*0x1000)+0x800,0,0,SMH_BANK(bank+1),SMH_BANK(bank+1));
760      memory_set_bankptr(space->machine,bank+1,RAM+(physical<<12));
761      //memory_install_readwrite8_handler(space,(bank*0x1000)+0x380,(bank*0x1000)+0x3ff,0,0,SMH_BANK(bank+1),SMH_BANK(bank+1));
762      // various sub CPU I/O ports
763      memory_install_readwrite8_handler(space,(bank*0x1000)+0x409,(bank*0x1000)+0x409,0,0,fm7_vram_access_r,fm7_vram_access_w);
764      memory_install_readwrite8_handler(space,(bank*0x1000)+0x40a,(bank*0x1000)+0x40a,0,0,fm7_sub_busyflag_r,fm7_sub_busyflag_w);
765      memory_install_write8_handler(space,(bank*0x1000)+0x40e,(bank*0x1000)+0x40f,0,0,fm7_vram_offset_w);
766      memory_install_readwrite8_handler(space,(bank*0x1000)+0x430,(bank*0x1000)+0x430,0,0,fm77av_video_flags_r,fm77av_video_flags_w);
767     
768      // sub monitor CGROM
769      memory_install_readwrite8_handler(space,(bank*0x1000)+0x800,(bank*0x1000)+size,0,0,SMH_BANK(20),SMH_UNMAP);
770      RAM = memory_region(space->machine,"subsyscg");
771      memory_set_bankptr(space->machine,20,RAM+(fm7_video.cgrom*0x800));
772      return;
773   }
693774   if(physical == 0x36 || physical == 0x37)
694775   {
695776      if(init_rom_en)
696777      {
697         RAM = memory_region(machine,"init");
698         memory_set_bankptr(machine,bank+1,RAM+(physical<<12)-0x36000);
778         RAM = memory_region(space->machine,"init");
779         memory_install_readwrite8_handler(space,bank*0x1000,(bank*0x1000)+size,0,0,SMH_BANK(bank+1),SMH_BANK(bank+1));
780         memory_set_bankptr(space->machine,bank+1,RAM+(physical<<12)-0x36000);
699781         return;
700782      }
701783   }
r5082r5083
703785   {
704786      if(basic_rom_en)
705787      {
706         RAM = memory_region(machine,"fbasic");
707         memory_set_bankptr(machine,bank+1,RAM+(physical<<12)-0x38000);
788         RAM = memory_region(space->machine,"fbasic");
789         memory_install_readwrite8_handler(space,bank*0x1000,(bank*0x1000)+size,0,0,SMH_BANK(bank+1),SMH_BANK(bank+1));
790         memory_set_bankptr(space->machine,bank+1,RAM+(physical<<12)-0x38000);
708791         return;
709792      }
710793   }
711   
712   memory_set_bankptr(machine,bank+1,RAM+(physical<<12));
794   memory_install_readwrite8_handler(space,bank*0x1000,(bank*0x1000)+size,0,0,SMH_BANK(bank+1),SMH_BANK(bank+1));
795   memory_set_bankptr(space->machine,bank+1,RAM+(physical<<12));
713796}
714797
715void fm7_mmr_refresh(running_machine* machine)
798void fm7_mmr_refresh(const address_space* space)
716799{
717800   int x;
718801   
719802   if(fm7_mmr.enabled)
720803   {
721804      for(x=0;x<16;x++)
722         fm7_update_bank(machine,x,fm7_mmr.bank_addr[fm7_mmr.segment][x]);
805         fm7_update_bank(space,x,fm7_mmr.bank_addr[fm7_mmr.segment][x]);
723806   }
724807   else
725808   {
726809      // when MMR is disabled, 0x30000-0x3ffff is banked in
727810      for(x=0;x<16;x++)
728         fm7_update_bank(machine,x,0x30+x);
811         fm7_update_bank(space,x,0x30+x);
729812   }
730813}
731814
r5082r5083
735818   {
736819      fm7_mmr.bank_addr[fm7_mmr.segment][offset] = data;
737820      if(fm7_mmr.enabled)
738         fm7_update_bank(space->machine,offset,data);
821         fm7_update_bank(space,offset,data);
739822      logerror("MMR: Segment %i, bank %i, set to  0x%02x\n",fm7_mmr.segment,offset,data);
740823      return;
741824   }
r5082r5083
743826   {
744827      case 0x10:
745828         fm7_mmr.segment = data & 0x07;
746         fm7_mmr_refresh(space->machine);
829         fm7_mmr_refresh(space);
747830         logerror("MMR: Active segment set to %i\n",fm7_mmr.segment);
748831         break;
749832      case 0x12:
r5082r5083
753836      case 0x13:
754837         fm7_mmr.mode = data;
755838         fm7_mmr.enabled = data & 0x80;
756         fm7_mmr_refresh(space->machine);
839         fm7_mmr_refresh(space);
757840         logerror("MMR: Mode register set to %02x\n",data);
758841         break;
759842   }
r5082r5083
851934   return -1;
852935}
853936
937void fm77av_fmirq(const device_config* device,int irq)
938{
939   if(irq == 1)
940   {
941      if(irq_mask & IRQ_FLAG_OTHER)
942      {     
943         irq_flags |= IRQ_FLAG_OTHER;
944         cputag_set_input_line(device->machine,"maincpu",M6809_IRQ_LINE,ASSERT_LINE);
945      }
946      fm77av_ym_irq = 1;
947   }
948   else
949   {
950//      cputag_set_input_line(device->machine,"maincpu",M6809_IRQ_LINE,CLEAR_LINE);
951      fm77av_ym_irq = 0;
952   }
953}
954
854955/*
855956   0000 - 7FFF: (RAM) BASIC working area, user's area
856957   8000 - FBFF: (ROM) F-BASIC ROM, extra user RAM
r5082r5083
9531054   AM_RANGE(0xfd14,0xfd14) AM_READ(fm7_unknown_r)
9541055   AM_RANGE(0xfd15,0xfd15) AM_DEVREADWRITE("ym",ym2203_status_port_r,ym2203_control_port_w)
9551056   AM_RANGE(0xfd16,0xfd16) AM_DEVREADWRITE("ym",ym2203_read_port_r,ym2203_write_port_w)
956   AM_RANGE(0xfd17,0xfd17) AM_READ(fm7_unknown_r)
1057   AM_RANGE(0xfd17,0xfd17) AM_READ(fm7_fmirq_r)
9571058   AM_RANGE(0xfd18,0xfd1f) AM_READWRITE(fm7_fdc_r,fm7_fdc_w)
9581059   AM_RANGE(0xfd24,0xfd2f) AM_READ(fm7_unknown_r)
9591060   AM_RANGE(0xfd30,0xfd34) AM_WRITE(fm77av_analog_palette_w)
r5082r5083
9641065   AM_RANGE(0xfd80,0xfd93) AM_READWRITE(fm7_mmr_r,fm7_mmr_w)
9651066   AM_RANGE(0xfd94,0xfdff) AM_READ(fm7_unknown_r)
9661067   // Boot ROM (RAM on FM77AV and later)
967   AM_RANGE(0xfe00,0xffef) AM_RAM
1068   AM_RANGE(0xfe00,0xffef) AM_RAM_WRITE(fm77av_bootram_w) AM_BASE(&fm7_boot_ram)
9681069   AM_RANGE(0xfff0,0xffff) AM_READWRITE(vector_r,vector_w)
9691070ADDRESS_MAP_END
9701071
9711072static ADDRESS_MAP_START( fm77av_sub_mem, ADDRESS_SPACE_PROGRAM, 8 )
9721073   AM_RANGE(0x0000,0xbfff) AM_READWRITE(fm7_vram_r,fm7_vram_w) // VRAM
973   AM_RANGE(0xc000,0xcfff) AM_RAM // Console RAM
974   AM_RANGE(0xd000,0xd37f) AM_RAM // Work RAM
1074   AM_RANGE(0xc000,0xcfff) AM_RAM AM_REGION("maincpu",0x1c000) // Console RAM
1075   AM_RANGE(0xd000,0xd37f) AM_RAM AM_REGION("maincpu",0x1d000) // Work RAM
9751076   AM_RANGE(0xd380,0xd3ff) AM_RAM AM_BASE(&shared_ram)
9761077   // I/O space (D400-D7FF)
9771078   AM_RANGE(0xd400,0xd401) AM_READ(fm7_sub_keyboard_r)
r5082r5083
9811082   AM_RANGE(0xd409,0xd409) AM_READWRITE(fm7_vram_access_r,fm7_vram_access_w)
9821083   AM_RANGE(0xd40a,0xd40a) AM_READWRITE(fm7_sub_busyflag_r,fm7_sub_busyflag_w)
9831084   AM_RANGE(0xd40e,0xd40f) AM_WRITE(fm7_vram_offset_w)
984   AM_RANGE(0xd430,0xd430) AM_READ(fm77av_video_flags_r)
1085   AM_RANGE(0xd430,0xd430) AM_READWRITE(fm77av_video_flags_r,fm77av_video_flags_w)
1086   AM_RANGE(0xd500,0xd7ff) AM_RAM AM_REGION("maincpu",0x1d500) // Work RAM
9851087   AM_RANGE(0xd800,0xdfff) AM_ROMBANK(20)
9861088   AM_RANGE(0xe000,0xffff) AM_ROMBANK(21)
9871089ADDRESS_MAP_END
r5082r5083
11571259   // last part of Initiate ROM is visible at the end of RAM too (interrupt vectors)   
11581260   memcpy(RAM+0xfff0,ROM+0x1ff0,16);
11591261
1160   RAM = memory_region(machine,"subsys_c");
11611262   fm7_video.subrom = 0;  // default sub CPU ROM is type C.
1263   RAM = memory_region(machine,"subsyscg");
11621264   memory_set_bankptr(machine,20,RAM);
1265   RAM = memory_region(machine,"subsys_c");
11631266   memory_set_bankptr(machine,21,RAM+0x800);
11641267   
11651268   fm7_type = SYS_FM77AV;
r5082r5083
11921295   fm7_mmr.mode = 0;
11931296   fm7_mmr.segment = 0;
11941297   fm7_mmr.enabled = 0;
1195   
1298   fm77av_ym_irq = 0;
11961299   // set boot mode (FM-7 only, AV and later has boot RAM instead)
11971300   if(fm7_type == SYS_FM7)
11981301   {
r5082r5083
12071310   }
12081311   if(fm7_type != SYS_FM7)  // set default RAM banks
12091312   {
1210      fm7_mmr_refresh(machine);
1313      fm7_mmr_refresh(cpu_get_address_space(cputag_get_cpu(machine,"maincpu"),ADDRESS_SPACE_PROGRAM));
12111314   }
12121315}
12131316
r5082r5083
12371340      DEVCB_NULL,               /* portA write */
12381341      DEVCB_NULL               /* portB write */
12391342   },
1240   NULL  // TODO
1343   fm77av_fmirq
12411344};
12421345
12431346static const cassette_config fm7_cassette_config =

Previous 15994 Revisions Next


© 1998-2018 The MESS Team