Previous 15994 Revisions Next

r8909 Thursday 26th August, 2010 at 14:27:54 UTC by Angelo Salese
[A310]: Improved sound
[src/mame/machine]archimds.c
[src/mess/drivers]a310.c

src/mame/machine/archimds.c
r8908r8909
5454UINT8 ioc_regs[0x80/4];
5555UINT8 vidc_bpp_mode;
5656UINT8 vidc_interlace;
57static UINT8 vidc_pixel_clk;
58static const UINT32 pixel_rate[4] = { 8000000, 12000000, 16000000, 24000000};
59static UINT8 vidc_stereo_reg[8];
5760
5861static emu_timer *timer[4], *snd_timer, *vid_timer;
5962emu_timer  *vbl_timer;
r8908r8909
134137static TIMER_CALLBACK( vidc_audio_tick )
135138{
136139   address_space *space = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM);
140   UINT8 ulaw_comp;
137141   INT16 res;
142   UINT8 ch;
143   static const char *const dac_port[8] = { "dac0", "dac1", "dac2", "dac3", "dac4", "dac5", "dac6", "dac7" };
138144
139   res = (space->read_word(vidc_sndstart+vidc_sndcur));
145   for(ch=0;ch<8;ch++)
146   {
147      ulaw_comp = (space->read_byte(vidc_sndstart+vidc_sndcur + ch));
140148
141   dac_signed_data_w(space->machine->device("dac"), res);
149      res=1<<((ulaw_comp>>5)+4);
150       res+=(((ulaw_comp>>1)&0xF)<<(ulaw_comp>>5));
151       if (ulaw_comp&1) res=-res;
142152
143   vidc_sndcur++;
153      dac_signed_data_16_w(space->machine->device(dac_port[ch & 7]), res);
154   }
144155
145   if (vidc_sndcur >= (vidc_sndend-vidc_sndstart)+0x40)
156   vidc_sndcur+=8;
157
158   if (vidc_sndcur >= (vidc_sndend-vidc_sndstart)+0x10)
146159   {
147160      vidc_sndcur = 0;
148161      archimedes_request_irq_b(machine, ARCHIMEDES_IRQB_SOUND_EMPTY);
r8908r8909
150163      if(!audio_dma_on)
151164      {
152165         timer_adjust_oneshot(snd_timer, attotime_never, 0);
153         dac_signed_data_16_w(space->machine->device("dac"), 0x8000);
166         for(ch=0;ch<8;ch++)
167            dac_signed_data_16_w(space->machine->device(dac_port[ch & 7]), 0x8000);
154168      }
155169   }
156170}
r8908r8909
693707   return 0;
694708}
695709
710static void vidc_dynamic_res_change(running_machine *machine)
711{
712   /* sanity checks - first pass */
713   /*
714      total cycles + border end
715   */
716   if(vidc_regs[VIDC_HCR] && vidc_regs[VIDC_HBER] &&
717      vidc_regs[VIDC_VCR] && vidc_regs[VIDC_VBER])
718   {
719      /* sanity checks - second pass */
720      /*
721      total cycles >= border end >= border start
722      */
723      if((vidc_regs[VIDC_HCR] >= vidc_regs[VIDC_HBER]) &&
724         (vidc_regs[VIDC_HBER] >= vidc_regs[VIDC_HBSR]) &&
725         (vidc_regs[VIDC_VCR] >= vidc_regs[VIDC_VBER]) &&
726         (vidc_regs[VIDC_VBER] >= vidc_regs[VIDC_VBSR]))
727      {
728         rectangle visarea;
729         attoseconds_t refresh;
730
731         visarea.min_x = 0;
732         visarea.min_y = 0;
733         visarea.max_x = vidc_regs[VIDC_HBER] - vidc_regs[VIDC_HBSR] - 1;
734         visarea.max_y = vidc_regs[VIDC_VBER] - vidc_regs[VIDC_VBSR];
735
736         logerror("Configuring: htotal %d vtotal %d border %d x %d display %d x %d\n",
737            vidc_regs[VIDC_HCR], vidc_regs[VIDC_VCR],
738            visarea.max_x, visarea.max_y,
739            vidc_regs[VIDC_HDER]-vidc_regs[VIDC_HDSR],vidc_regs[VIDC_VDER]-vidc_regs[VIDC_VDSR]+1);
740
741         /* FIXME: pixel clock */
742         refresh = HZ_TO_ATTOSECONDS(pixel_rate[vidc_pixel_clk]*2) * vidc_regs[VIDC_HCR] * vidc_regs[VIDC_VCR];
743
744         machine->primary_screen->configure(vidc_regs[VIDC_HCR], vidc_regs[VIDC_VCR], visarea, refresh);
745      }
746   }
747}
748
696749WRITE32_HANDLER(archimedes_vidc_w)
697750{
698751   UINT32 reg = data>>24;
r8908r8909
753806      }
754807
755808   }
809   else if (reg >= 0x60 && reg <= 0x7c)
810   {
811      vidc_stereo_reg[(reg >> 2) & 7] = val & 0x07;
812
813//      popmessage("%02x %02x %02x %02x %02x %02x %02x %02x",vidc_stereo_reg[0],vidc_stereo_reg[1],vidc_stereo_reg[2],vidc_stereo_reg[3]
814//      ,vidc_stereo_reg[4],vidc_stereo_reg[5],vidc_stereo_reg[6],vidc_stereo_reg[7]);
815   }
756816   else if (reg >= 0x80 && reg <= 0xbc)
757817   {
758818      switch(reg)
r8908r8909
781841      logerror("VIDC: %s = %d\n", vrnames[(reg-0x80)/4], vidc_regs[reg]);
782842      //#endif
783843
784      /* sanity checks - first pass */
785      /*
786         total cycles + border end
787      */
788      if(vidc_regs[VIDC_HCR] && vidc_regs[VIDC_HBER] &&
789         vidc_regs[VIDC_VCR] && vidc_regs[VIDC_VBER])
790      {
791         /* sanity checks - second pass */
792         /*
793         total cycles >= border end >= border start
794         */
795         if((vidc_regs[VIDC_HCR] >= vidc_regs[VIDC_HBER]) &&
796            (vidc_regs[VIDC_HBER] >= vidc_regs[VIDC_HBSR]) &&
797            (vidc_regs[VIDC_VCR] >= vidc_regs[VIDC_VBER]) &&
798            (vidc_regs[VIDC_VBER] >= vidc_regs[VIDC_VBSR]))
799         {
800            rectangle visarea;
801            attoseconds_t refresh;
802
803            visarea.min_x = 0;
804            visarea.min_y = 0;
805            visarea.max_x = vidc_regs[VIDC_HBER] - vidc_regs[VIDC_HBSR] - 1;
806            visarea.max_y = vidc_regs[VIDC_VBER] - vidc_regs[VIDC_VBSR];
807
808            logerror("Configuring: htotal %d vtotal %d border %d x %d display %d x %d\n",
809               vidc_regs[VIDC_HCR], vidc_regs[VIDC_VCR],
810               visarea.max_x, visarea.max_y,
811               vidc_regs[VIDC_HDER]-vidc_regs[VIDC_HDSR],vidc_regs[VIDC_VDER]-vidc_regs[VIDC_VDSR]+1);
812
813            /* FIXME: pixel clock */
814            refresh = HZ_TO_ATTOSECONDS(16000000) * vidc_regs[VIDC_HCR] * vidc_regs[VIDC_VCR];
815
816            space->machine->primary_screen->configure(vidc_regs[VIDC_HCR], vidc_regs[VIDC_VCR], visarea, refresh);
817         }
818      }
819
844      vidc_dynamic_res_change(space->machine);
820845   }
821846   else if(reg == 0xe0)
822847   {
823      vidc_bpp_mode = ((val & 0xc) >> 2);
848      vidc_bpp_mode = ((val & 0x0c) >> 2);
824849      vidc_interlace = ((val & 0x40) >> 6);
850      vidc_pixel_clk = (val & 0x03);
851      vidc_dynamic_res_change(space->machine);
825852   }
826853   else
827854   {
r8908r8909
892919               double sndhz;
893920
894921               /* FIXME: is the frequency correct? */
895               sndhz = (250000.0 * 4) / (double)((vidc_regs[0xc0]&0xff)+2);
922               sndhz = (250000.0 / 2) / (double)((vidc_regs[0xc0]&0xff)+2);
896923
897924               printf("MEMC: Starting audio DMA at %f Hz, buffer from %x to %x\n", sndhz, vidc_sndstart, vidc_sndend);
898925
src/mess/drivers/a310.c
r8908r8909
107107   archimedes_init(machine);
108108
109109   // reset the DAC to centerline
110   dac_signed_data_w(machine->device("dac"), 0x80);
110   //dac_signed_data_w(machine->device("dac"), 0x80);
111111}
112112
113113static MACHINE_RESET( a310 )
r8908r8909
275275   MDRV_RAM_DEFAULT_SIZE("2M")
276276   MDRV_RAM_EXTRA_OPTIONS("512K, 1M, 4M, 8M, 16M")
277277
278   MDRV_SPEAKER_STANDARD_MONO("a310")
279   MDRV_SOUND_ADD("dac", DAC, 0)
280   MDRV_SOUND_ROUTE(0, "a310", 1.00)
281
282278   MDRV_WD1772_ADD("wd1772", a310_wd17xx_interface )
283279
284280   //MDRV_FLOPPY_4_DRIVES_ADD(a310_floppy_config)
281
282   MDRV_SPEAKER_STANDARD_MONO("mono")
283   MDRV_SOUND_ADD("dac0", DAC, 0)
284   MDRV_SOUND_ROUTE(0, "mono", 0.10)
285
286   MDRV_SOUND_ADD("dac1", DAC, 0)
287   MDRV_SOUND_ROUTE(0, "mono", 0.10)
288
289   MDRV_SOUND_ADD("dac2", DAC, 0)
290   MDRV_SOUND_ROUTE(0, "mono", 0.10)
291
292   MDRV_SOUND_ADD("dac3", DAC, 0)
293   MDRV_SOUND_ROUTE(0, "mono", 0.10)
294
295   MDRV_SOUND_ADD("dac4", DAC, 0)
296   MDRV_SOUND_ROUTE(0, "mono", 0.10)
297
298   MDRV_SOUND_ADD("dac5", DAC, 0)
299   MDRV_SOUND_ROUTE(0, "mono", 0.10)
300
301   MDRV_SOUND_ADD("dac6", DAC, 0)
302   MDRV_SOUND_ROUTE(0, "mono", 0.10)
303
304   MDRV_SOUND_ADD("dac7", DAC, 0)
305   MDRV_SOUND_ROUTE(0, "mono", 0.10)
285306MACHINE_DRIVER_END
286307
287308ROM_START(a310)

Previous 15994 Revisions Next


© 1998-2018 The MESS Team