Previous 15994 Revisions Next

r6129 Sunday 18th October, 2009 at 10:46:41 UTC by Harmony
[CDI] Un-regressing Mario Hotel's RLE video and ability to get in-game [Harmony]
[src/mess/drivers]cdi.c

src/mess/drivers/cdi.c
r6128r6129
914914   emu_timer *interrupt_timer;
915915   cdrom_file *cd;
916916
917   emu_timer *audio_stream_timer;
918   INT16 audio_stream_samples[18*28*16*CDIC_BUFFERED_SECTORS];
919   INT32 audio_stream_queued;
920   INT32 audio_stream_index;
921   INT32 audio_stream_end;
922   INT32 audio_stream_playing;
917   emu_timer *audio_sample_timer;
918   INT32 audio_sample_freq;
919   INT32 audio_sample_size;
923920
924921} cdic_regs_t;
925922
r6128r6129
11691166   // Get XA format from sector header
11701167
11711168   const unsigned char *hdr = xa + 4;
1172   double freq;
11731169   int channels;
11741170   int bits = 4;
11751171   int index = 0;
1176   int size = 2;
11771172   INT16 samples[18*28*16+16];
11781173   FILE* temp_adpcm = fopen("temp_adpcm.bin","ab");
11791174
r6128r6129
11831178   {
11841179      case 0:
11851180         channels=1;
1186         freq=37800.0f;   //18900.0f;
1181         cdic_regs.audio_sample_freq=37800.0f;   //18900.0f;
11871182         bits=4;
1188         size=4;
1183         cdic_regs.audio_sample_size=4;
11891184         break;
11901185
11911186      case 1:
11921187         channels=2;
1193         freq=37800.0f;
1188         cdic_regs.audio_sample_freq=37800.0f;
11941189         bits=4;
1195         size=2;
1190         cdic_regs.audio_sample_size=2;
11961191         break;
11971192
11981193      case 4:
11991194         channels=1;
1200         freq=18900.0f;   ///2.0f;
1195         cdic_regs.audio_sample_freq=18900.0f;   ///2.0f;
12011196         bits=4;
1202         size=4;
1197         cdic_regs.audio_sample_size=4;
12031198         break;
12041199
12051200      case 5:
12061201         channels=2;
1207         freq=18900.0f;   //37800.0f/2.0f;
1202         cdic_regs.audio_sample_freq=18900.0f;   //37800.0f/2.0f;
12081203         bits=4;
1209         size=2;
1204         cdic_regs.audio_sample_size=2;
12101205         break;
12111206
12121207      case 16:
12131208         channels=1;
1214         freq=37800.0f;
1209         cdic_regs.audio_sample_freq=37800.0f;
12151210         bits=8;
1216         size=2;
1211         cdic_regs.audio_sample_size=2;
12171212         break;
12181213
12191214      case 17:
12201215         channels=2;
1221         freq=37800.0f;
1216         cdic_regs.audio_sample_freq=37800.0f;
12221217         bits=8;
1223         size=1;
1218         cdic_regs.audio_sample_size=1;
12241219         break;
12251220
12261221      default:
r6128r6129
12281223         return;
12291224   }
12301225
1231   dmadac_set_frequency(&dmadac[0], 2, freq);
12321226   dmadac_enable(&dmadac[0], 2, 1);
1227   dmadac_set_frequency(&dmadac[0], 2, cdic_regs.audio_sample_freq);
12331228
12341229   switch(channels)
12351230   {
r6128r6129
12761271         break;
12771272   }
12781273
1279    dmadac_transfer(&dmadac[0], 2, 2, 2, 18*28*2*size, samples);
1274    dmadac_transfer(&dmadac[0], 2, 2, 2, 18*28*2*cdic_regs.audio_sample_size, samples);
12801275
12811276   fclose(temp_adpcm);
12821277}
12831278
1279static TIMER_CALLBACK( audio_sample_trigger )
1280{
1281   cdic_regs.z_buffer += 0xa00;
1282   cdic_decode_audio_sector(machine, ((UINT8*)cdram) + cdic_regs.z_buffer + 4);
1283   timer_adjust_oneshot(cdic_regs.audio_sample_timer, attotime_never, 0);
1284   //dmadac_enable(&dmadac[0], 2, 0);
1285}
1286
12841287static TIMER_CALLBACK( cdic_trigger_readback_int )
12851288{
12861289   switch(cdic_regs.command)
r6128r6129
13931396         }
13941397         else if((buffer[CDIC_SECTOR_SUBMODE2] & (CDIC_SUBMODE_DATA | CDIC_SUBMODE_AUDIO | CDIC_SUBMODE_VIDEO)) == 0x00)
13951398         {
1399            cdic_regs.data_buffer &= ~0x0004;
13961400            cdic_regs.data_buffer ^= 0x0001;
13971401            for(index = 6; index < 2352/2; index++)
13981402            {
13991403               cdram[(cdic_regs.data_buffer & 5) * (0xa00/2) + (index - 6)] = (buffer[index*2] << 8) | buffer[index*2 + 1];
14001404            }
14011405
1402            if(buffer[CDIC_SECTOR_SUBMODE2] & (CDIC_SUBMODE_EOF || CDIC_SUBMODE_TRIG || CDIC_SUBMODE_EOR))
1406            if((buffer[CDIC_SECTOR_SUBMODE2] & CDIC_SUBMODE_TRIG) == CDIC_SUBMODE_TRIG || (buffer[CDIC_SECTOR_SUBMODE2] & (CDIC_SUBMODE_EOR | CDIC_SUBMODE_FORM)) == (CDIC_SUBMODE_EOR | CDIC_SUBMODE_FORM))
14031407            {
14041408               cdic_regs.x_buffer |= 0x8000;
14051409
r6128r6129
14511455      case 0x24: // Mode 2 Reset
14521456      case 0x2e: // Abort
14531457         timer_adjust_oneshot(cdic_regs.interrupt_timer, ATTOTIME_IN_HZ(75), 0); // 75Hz = 1x CD-ROM speed
1454         cdic_regs.data_buffer &= 0x3ffe;
1458         cdic_regs.data_buffer &= 0x3fff;
14551459         break;
14561460   }
14571461}
r6128r6129
15441548         UINT32 start = scc68070_regs.dma.channel[0].memory_address_counter;
15451549         UINT32 count = scc68070_regs.dma.channel[0].transfer_counter;
15461550         UINT32 index = 0;
1547         UINT32 device_index = (data & 0x7fff) >> 1;
1551         UINT32 device_index = (data & 0x3fff) >> 1;
15481552         UINT16 *memory = planea;
15491553         verboselog(space->machine, 0, "memory address counter: %08x\n", scc68070_regs.dma.channel[0].memory_address_counter);
15501554         verboselog(space->machine, 0, "cdic_w: DMA Control Register = %04x & %04x\n", data, mem_mask);
r6128r6129
15641568            else
15651569            {
15661570               cdram[device_index++] = memory[index];
1567               //printf( "%04x ", memory[index] );
15681571            }
15691572         }
1570         /*
1571         if(!(scc68070_regs.dma.channel[0].operation_control & OCR_D))
1572         {
1573            printf( "\n" );
1574         }
1575         */
15761573         scc68070_regs.dma.channel[0].memory_address_counter += scc68070_regs.dma.channel[0].transfer_counter * 2;
15771574         break;
15781575      }
15791576      case 0x3ffa/2:
15801577         verboselog(space->machine, 0, "cdic_w: Z-Buffer Register = %04x & %04x\n", data, mem_mask);
15811578         COMBINE_DATA(&cdic_regs.z_buffer);
1579         if(cdic_regs.z_buffer & 0x2000)
1580         {
1581            // Broken.
1582            //attotime period = attotime_mul(ATTOTIME_IN_HZ(cdic_regs.audio_sample_freq), 18*28*4*cdic_regs.audio_sample_size);
1583            //timer_adjust_oneshot(cdic_regs.audio_sample_timer, period, 0);
1584            //cdic_decode_audio_sector(space->machine, ((UINT8*)cdram) + cdic_regs.z_buffer + 4);
1585         }
15821586         break;
15831587      case 0x3ffc/2:
15841588         verboselog(space->machine, 0, "cdic_w: Interrupt Vector Register = %04x & %04x\n", data, mem_mask);
r6128r6129
15961600               case 0x23: // Reset Mode 1
15971601               case 0x24: // Reset Mode 2
15981602               case 0x2e: // Abort
1599                  timer_adjust_oneshot(cdic_regs.interrupt_timer, ATTOTIME_IN_HZ(75), 0); // 75Hz = 1x CD-ROM speed
1600                  //timer_adjust_oneshot(cdic_regs.interrupt_timer, attotime_never, 0);
1603                  //timer_adjust_oneshot(cdic_regs.interrupt_timer, ATTOTIME_IN_HZ(75), 0); // 75Hz = 1x CD-ROM speed
1604                  timer_adjust_oneshot(cdic_regs.interrupt_timer, attotime_never, 0);
1605                  cdic_regs.data_buffer &= 0x3fff;
16011606                  dmadac_enable(&dmadac[0], 2, 0);
16021607                  break;
16031608               case 0x29: // Read Mode 1
r6128r6129
18871892            slave_regs.in_index++;
18881893            switch(data & 0x00ff)
18891894            {
1895               case 0x82: // Mute audio
1896                  verboselog(space->machine, 0, "slave_w: Channel %d: Mute Audio (0x82)\n", offset );
1897                  dmadac_enable(&dmadac[0], 2, 0);
1898                  slave_regs.in_index = 0;
1899                  slave_regs.in_count = 0;
1900                  break;
1901               case 0x83: // Unmute audio
1902                  verboselog(space->machine, 0, "slave_w: Channel %d: Unmute Audio (0x83)\n", offset );
1903                  dmadac_enable(&dmadac[0], 2, 1);
1904                  slave_regs.in_index = 0;
1905                  slave_regs.in_count = 0;
1906                  break;
18901907               case 0xf0: // Set Front Panel LCD
18911908                  verboselog(space->machine, 0, "slave_w: Channel %d: Set Front Panel LCD (0xf0)\n", offset );
18921909                  slave_regs.in_count = 17;
r6128r6129
36353652   cdic_regs.interrupt_timer = timer_alloc(machine, cdic_trigger_readback_int, 0);
36363653   timer_adjust_oneshot(cdic_regs.interrupt_timer, attotime_never, 0);
36373654
3638   cdic_regs.audio_stream_timer = timer_alloc(machine, cdic_trigger_readback_int, 0);
3639   timer_adjust_oneshot(cdic_regs.audio_stream_timer, attotime_never, 0);
3655   cdic_regs.audio_sample_timer = timer_alloc(machine, audio_sample_trigger, 0);
3656   timer_adjust_oneshot(cdic_regs.audio_sample_timer, attotime_never, 0);
36403657
3658   /*
36413659   memset(cdic_regs.audio_stream_samples, 0, 18*28*16*CDIC_BUFFERED_SECTORS * sizeof(INT16));
36423660   cdic_regs.audio_stream_queued = 0;
36433661   cdic_regs.audio_stream_index = 0;
36443662   cdic_regs.audio_stream_end = 0;
36453663   cdic_regs.audio_stream_playing = 0;
3664   */
36463665
36473666   if( cdrom_dev )
36483667   {

Previous 15994 Revisions Next


© 1998-2018 The MESS Team