Previous 199869 Revisions Next

r22101 Tuesday 26th March, 2013 at 21:25:48 UTC by Carl
spu: add cdda interrupts [Carl]
(mess) psxcd: cdda muting (nw)
[src/emu/sound]spu.c spu.h
[src/mess/machine]psxcd.c psxcd.h

trunk/src/emu/sound/spu.c
r22100r22101
10471047
10481048   cdda_cnt=0;
10491049   cdda_playing=false;
1050   m_cd_out_ptr = 0;
10501051
10511052   memset(spu_ram,0,spu_ram_size);
10521053   memset(reg,0,0x200);
r22100r22101
24782479
24792480      while ((cdda_buffer->get_bytes_in()) && (n--))
24802481      {
2481         dp[0]=clamp(dp[0]+((sp[0]*voll)>>15));
2482         dp[1]=clamp(dp[1]+((sp[1]*volr)>>15));
2482
2483         INT16 vl = ((sp[0]*voll)>>15);
2484         INT16 vr = ((sp[1]*volr)>>15);
2485
2486         *(signed short *)(spu_ram+m_cd_out_ptr)=vl;
2487         *(signed short *)(spu_ram+m_cd_out_ptr+0x400)=vr;
2488         m_cd_out_ptr=(m_cd_out_ptr+2)&0x3ff;
2489
2490         if((m_cd_out_ptr == (spureg.irq_addr & ~0x401)) && (spureg.ctrl & spuctrl_irq_enable))
2491            m_irq_handler(1);
2492
2493         dp[0]=clamp(dp[0]+vl);
2494         dp[1]=clamp(dp[1]+vr);
24832495         dp+=2;
24842496
24852497         cdda_cnt+=freq;
r22100r22101
25022514
25032515//      if (n>0) printf("cdda buffer underflow (n=%d cdda_in=%d spf=%d)\n",n,cdda_buffer->get_bytes_in(),cdda_spf);
25042516   }
2517   else if((spureg.irq_addr < 0x800) && (spureg.ctrl & spuctrl_irq_enable))
2518   {
2519      UINT16 irq_addr = spureg.irq_addr & ~0x401;
2520      UINT32 end = m_cd_out_ptr + (sz >> 1);
2521      if((m_cd_out_ptr < irq_addr) && (end > irq_addr))
2522         m_irq_handler(1);
2523      m_cd_out_ptr =  end & 0x3fe;
2524   }
25052525}
25062526
25072527//
trunk/src/emu/sound/spu.h
r22100r22101
6868               cur_generate_sample,
6969               dirty_flags;
7070
71   UINT16 m_cd_out_ptr;
72
7173   signed short xa_last[4];
7274   bool status_enabled,
7375            xa_playing,
trunk/src/mess/machine/psxcd.c
r22100r22101
134134   secskip = 0;
135135   next_read_event = -1;
136136   cbp = cmdbuf;
137   m_mute = false;
137138
138139   status=status_shellopen;
139140   sr=8|1;
r22100r22101
556557      printf("cdrom: mute\n");
557558   #endif
558559
560   m_mute = true;
559561   send_result(intr_acknowledge);
560562}
561563
r22100r22101
565567      printf("cdrom: demute\n");
566568   #endif
567569
570   m_mute = false;
568571   send_result(intr_acknowledge);
569572}
570573
r22100r22101
828831      static unsigned char gamedata[8] = { 0x00, 0x00, 0x00, 0x00, 'S', 'C', 'E', 'A' };
829832      static unsigned char audiodata[8] = { 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; // drops into the audio CD player.  08 80 goes to the menu.
830833
831      if(status & status_invalid)
834      if(cdrom_get_track_type(m_cdrom_handle, 0) == CD_TRACK_AUDIO)
832835      {
833         audiodata[0] = status;
836         audiodata[0] = status | status_invalid;
834837         send_result(intr_acknowledge,audiodata,8);
835838      }
836839      else
r22100r22101
11381141         //read_next_sector();
11391142      } else
11401143      {
1144#ifdef debug_cdrom
11411145         printf("autopause xa\n");
1146#endif
11421147         stop_read();
11431148      }
11441149   }
r22100r22101
11541159
11551160   if (status&status_playing)
11561161   {
1157      m_spu->play_cdda(0,secbuf[sectail]);
1162      if(!m_mute)
1163         m_spu->play_cdda(0,secbuf[sectail]);
11581164      sectail=(sectail+1)&(sector_buffer_size-1);
11591165
11601166      curpos.b[F]++;
r22100r22101
11791185      {
11801186         if (sector>=autopause_sector)
11811187         {
1188#ifdef debug_cdrom
11821189            printf("autopause cdda\n");
1183
1190#endif
1191            stop_read();
11841192            command_result *res=global_alloc(command_result);
11851193            res->res=intr_dataend;
1186            res->data[0]=status_standby;
1194            res->data[0]=status;
11871195            res->sz=1;
11881196            cmd_complete(res);
1189            stop_read();
11901197            return;
11911198         }
11921199      }
r22100r22101
11971204         UINT8 track = cdrom_get_track(m_cdrom_handle, sector) + 1;
11981205         res->res=intr_dataready;
11991206
1200         res->data[0]=status_playing|status_standby;
1207         res->data[0]=status;
12011208         res->data[1]=decimal_to_bcd(track);
12021209         res->data[2]=1;
12031210         if(sector & 0x10)
r22100r22101
12291236
12301237      if(!read_next_sector())
12311238      {
1239         stop_read(); // assume we've reached the end
12321240         command_result *res=global_alloc(command_result);
12331241         res->res=intr_dataend;
1234         res->data[0]=status_standby;
1242         res->data[0]=status;
12351243         res->sz=1;
12361244         cmd_complete(res);
1237         stop_read(); // assume we've reached the end
12381245      }
12391246   }
12401247}
r22100r22101
12501257   int type;
12511258   next_read_event=-1;
12521259
1260   UINT32 pos=msf_to_lba_ps(curpos.w);
12531261   //
1262   if(!(mode & mode_cdda) && (cdrom_get_track_type(m_cdrom_handle, cdrom_get_track(m_cdrom_handle, pos + 150)) == CD_TRACK_AUDIO))
1263   {
1264      command_result *res=global_alloc(command_result);
1265      res->res=intr_diskerror;
1266      res->data[0]=status | status_error;
1267      res->data[1]=0x40;
1268      res->sz=2;
1269      cmd_complete(res);
1270      return;
1271   }
12541272
1255   UINT32 pos=msf_to_lba_ps(curpos.w);
12561273   unsigned char *buf=secbuf[sechead];
12571274   if (! cdrom_read_data(m_cdrom_handle, pos, buf, CD_TRACK_RAW_DONTCARE))
12581275   {
r22100r22101
14191436      case event_change_disk:
14201437         open = false;
14211438         status |= status_standby;
1422         if(cdrom_get_track_type(m_cdrom_handle, 0) == CD_TRACK_AUDIO)
1423            status |= status_invalid;
14241439         break;
14251440   }
14261441}
trunk/src/mess/machine/psxcd.h
r22100r22101
7474   };
7575#endif
7676
77   bool open,
77   bool open, m_mute,
7878            streaming;
7979   device_timer_id next_read_event;
8080   INT64 next_sector_t;
81   unsigned int autopause_sector,
82                        xa_prefetch_sector,
83                        cdda_prefetch_sector;
81   unsigned int autopause_sector;
8482
8583   unsigned int start_read_delay,
8684                        read_sector_cycles,

Previous 199869 Revisions Next


© 1997-2024 The MAME Team