Exemple #1
0
void Reset6502(M6502 *R)
{
  R->A=R->X=R->Y=0x00;
  R->P=Z_FLAG|R_FLAG;
  R->S=0xFF;
  R->PC.B.l=Rd6502(0xFFFC);
  R->PC.B.h=Rd6502(0xFFFD);   
  R->ICount=R->IPeriod;
  R->IRequest=INT_NONE;
  R->AfterCLI=0;
}
Exemple #2
0
void Int6502(M6502 *R,byte Type)
{
  register pair J;

  if((Type==INT_NMI)||((Type==INT_IRQ)&&!(R->P&I_FLAG)))
  {
    R->ICount-=7;
    M_PUSH(R->PC.B.h);
    M_PUSH(R->PC.B.l);
    M_PUSH(R->P&~B_FLAG);
    R->P&=~D_FLAG;
    if(Type==INT_NMI) J.W=0xFFFA; else { R->P|=I_FLAG;J.W=0xFFFE; }
    R->PC.B.l=Rd6502(J.W++);
    R->PC.B.h=Rd6502(J.W);
  }
}
Exemple #3
0
void supervision_exec(unsigned short *backbuffer, unsigned char bRender)
{
	uint32 supervision_scanline, scan1=0;
	int i;

	for (supervision_scanline = 0; supervision_scanline < 160; supervision_scanline++)
	{
		m6502_registers.ICount = 512; 
		//Default is 512 
		timer_exec((m6502_registers.ICount));
			
#ifdef GP2X
		if(currentConfig.enable_sound) sound_exec(11025/160);
#else
		sound_exec(22050/160);
#endif
		Run6502(&m6502_registers);
			
#ifdef NDS
		gpu_render_scanline(supervision_scanline, backbuffer);
		backbuffer += 160+96;
#else
		gpu_render_scanline_fast(scan1, backbuffer);
		backbuffer += 160;
		scan1 += 0x30;
#endif
	}

	if (Rd6502(0x2026)&0x01)
		Int6502(supervision_get6502regs(), INT_NMI);
}
Exemple #4
0
static void
pce_cd_handle_command (void)
{

  if (pce_cd_cmdcnt)
    {
#ifdef CD_DEBUG
      fprintf (stderr, "Command arg received: 0x%02x.\n", io.cd_port_1801);
#endif

      if (--pce_cd_cmdcnt)
	io.cd_port_1800 = 0xd0;
      else
	io.cd_port_1800 = 0xc8;

      switch (pce_cd_curcmd)
	{
	case 0x08:
	  if (!pce_cd_cmdcnt)
	    {
#ifdef CD_DEBUG
	      fprintf (stderr, "Read command: %d sectors.\n", io.cd_port_1801);
	      fprintf (stderr, "Starting at %02x:%02x:%02x.\n",
		       pce_cd_sectoraddress[0], pce_cd_sectoraddress[1],
		       pce_cd_sectoraddress[2]);
	      fprintf (stderr, "MODE : %x\n", Rd6502 (0x20FF));
#endif

	      cd_sectorcnt = io.cd_port_1801;

              if (cd_sectorcnt == 0)
                {
                  fprintf(stderr, "cd_sectorcnt == 0 !!!");
                  Log("cd_sectorcnt == 0 !!!");
                }

	      pce_cd_set_sector_address ();
	      pce_cd_read_sector ();


	      /* TEST */
	      // cd_port_1800 = 0xD0; // Xanadu 2 doesn't block but still crash
	      /* TEST */

#ifdef CD_DEBUG
	      fprintf (stderr, "Result of reading : $1800 = 0X%02X\n\n\n",
		       io.cd_port_1800);
#endif

/* TEST ZEO
    if (Rd6502(0x20ff)==0xfe)
     cd_port_1800 = 0x98;
    else
     cd_port_1800 = 0xc8;
 * ******** */

	    }
	  else
	    pce_cd_sectoraddress[3 - pce_cd_cmdcnt] = io.cd_port_1801;

	  break;
	case 0xd8:

	  pce_cd_temp_play[pce_cd_cmdcnt] = io.cd_port_1801;

	  if (!pce_cd_cmdcnt)
	    {
	      io.cd_port_1800 = 0xd8;
	    }
	  break;
	case 0xd9:

	  pce_cd_temp_stop[pce_cd_cmdcnt] = io.cd_port_1801;

	  if (!pce_cd_cmdcnt)
	    {
	      io.cd_port_1800 = 0xd8;
/*
               if (pce_cd_temp_stop[3] == 1)
                 osd_cd_play_audio_track(bcdbin[pce_cd_temp_play[2]]);
               else
*/
	      if ((pce_cd_temp_play[0] |
		   pce_cd_temp_play[1] |
		   pce_cd_temp_stop[0] | pce_cd_temp_stop[1]) == 0)
		{
		  if (CD_emulation == 5)
		    HCD_play_track (bcdbin[pce_cd_temp_play[2]], 1);
		  else
		    osd_cd_play_audio_track (bcdbin[pce_cd_temp_play[2]]);
		}
	      else
		{
		  if (CD_emulation == 5)
		    HCD_play_sectors (Time2Frame (bcdbin[pce_cd_temp_play[2]],
						  bcdbin[pce_cd_temp_play[1]],
						  bcdbin[pce_cd_temp_play[0]]),
				      Time2Frame (bcdbin[pce_cd_temp_stop[2]],
						  bcdbin[pce_cd_temp_stop[1]],
						  bcdbin[pce_cd_temp_stop[0]]),
				      pce_cd_temp_stop[3] == 1);
		  else
		    osd_cd_play_audio_range (bcdbin[pce_cd_temp_play[2]],
					     bcdbin[pce_cd_temp_play[1]],
					     bcdbin[pce_cd_temp_play[0]],
					     bcdbin[pce_cd_temp_stop[2]],
					     bcdbin[pce_cd_temp_stop[1]],
					     bcdbin[pce_cd_temp_stop[0]]);
		}
	      Log ("play from %d:%d:%d:(%d) to %d:%d:%d:(%d)\nloop = %d\n",
		   bcdbin[pce_cd_temp_play[2]],
		   bcdbin[pce_cd_temp_play[1]],
		   bcdbin[pce_cd_temp_play[0]],
		   pce_cd_temp_play[3],
		   bcdbin[pce_cd_temp_stop[2]],
		   bcdbin[pce_cd_temp_stop[1]],
		   bcdbin[pce_cd_temp_stop[0]],
		   pce_cd_temp_stop[3], pce_cd_temp_stop[3] == 1);

	    }
	  break;
	case 0xde:

#ifdef CD_DEBUG
	  Log (" Arg for 0xde command is %X, command count is %d\n",
	       io.cd_port_1801, pce_cd_cmdcnt);
#endif

	  if (pce_cd_cmdcnt)
	    pce_cd_temp_dirinfo[pce_cd_cmdcnt] = io.cd_port_1801;
	  else
	    {
	      // We have received two arguments in pce_cd_temp_dirinfo
	      // We can use only one
	      // There's an argument indicating the kind of info we want
	      // and an optional argument for track number

	      pce_cd_temp_dirinfo[0] = io.cd_port_1801;

#ifdef CD_DEBUG
	      Log
		(" I'll answer to 0xde command request\nArguments are %x, %x, %x, %x\n",
		 pce_cd_temp_dirinfo[0], pce_cd_temp_dirinfo[1],
		 pce_cd_temp_dirinfo[2], pce_cd_temp_dirinfo[3]);
#endif

	      switch (pce_cd_temp_dirinfo[1])
		{
		case 0:
		  // We want info on number of first and last track

		  switch (CD_emulation)
		    {
		    case 2:
		    case 3:
		    case 4:
		      pce_cd_dirinfo[0] = binbcd[01];	// Number of first track  (BCD)
		      pce_cd_dirinfo[1] = binbcd[nb_max_track];	// Number of last track (BCD)
		      break;
		    case 1:
		      {
			int first_track, last_track;
			osd_cd_nb_tracks (&first_track, &last_track);
			pce_cd_dirinfo[0] = binbcd[first_track];
			pce_cd_dirinfo[1] = binbcd[last_track];
		      }
		      break;
		    case 5:
		      Log ("HCD: first track %d, last track %d\n",
			   HCD_first_track, HCD_last_track);
		      pce_cd_dirinfo[0] = binbcd[HCD_first_track];
		      pce_cd_dirinfo[1] = binbcd[HCD_last_track];
		      break;
		    }		// switch CD emulation

		  cd_read_buffer = pce_cd_dirinfo;
		  pce_cd_read_datacnt = 2;

#ifdef CD_DEBUG
		  Log (" Data resulting of 0xde request is %x and %x\n",
		       cd_read_buffer[0], cd_read_buffer[1]);
#endif
		  break;

		case 2:

		  // We want info on the track whose number is pce_cd_temp_dirinfo[0]

		  switch (CD_emulation)
		    {
		    case 2:
		    case 3:
		    case 4:
		    case 5:

		      pce_cd_dirinfo[0] =
			CD_track[bcdbin[pce_cd_temp_dirinfo[0]]].beg_min;
		      pce_cd_dirinfo[1] =
			CD_track[bcdbin[pce_cd_temp_dirinfo[0]]].beg_sec;
		      pce_cd_dirinfo[2] =
			CD_track[bcdbin[pce_cd_temp_dirinfo[0]]].beg_fra;
		      pce_cd_dirinfo[3] =
			CD_track[bcdbin[pce_cd_temp_dirinfo[0]]].type;

#ifdef CD_DEBUG
		      Log ("Type of track %d is %d\n",
			   bcdbin[pce_cd_temp_dirinfo[0]],
			   CD_track[bcdbin[pce_cd_temp_dirinfo[0]]].type);
#endif
		      break;
		    case 1:
		      {
			int Min, Sec, Fra, Ctrl;
			osd_cd_track_info (bcdbin[pce_cd_temp_dirinfo[0]],
					   &Min, &Sec, &Fra, &Ctrl);

			pce_cd_dirinfo[0] = binbcd[Min];
			pce_cd_dirinfo[1] = binbcd[Sec];
			pce_cd_dirinfo[2] = binbcd[Fra];
			pce_cd_dirinfo[3] = Ctrl;

			Log
			  ("The control byte of the audio track #%d is 0x%02X\n",
			   bcdbin[pce_cd_temp_dirinfo[0]], pce_cd_dirinfo[3]);

			break;

		      }		// case CD emulation = 1

		    }		// switch CD emulation

		  pce_cd_read_datacnt = 3;
		  cd_read_buffer = pce_cd_dirinfo;

		  break;

		case 1:

		  switch (CD_emulation)
		    {
		    case 1:
		      {

			int min, sec, fra;

			osd_cd_length (&min, &sec, &fra);

			pce_cd_dirinfo[0] = binbcd[min];
			pce_cd_dirinfo[1] = binbcd[sec];
			pce_cd_dirinfo[2] = binbcd[fra];

			break;
		      }		// case Cd emulation = 1
		    default:
		      pce_cd_dirinfo[0] = 0x25;
		      pce_cd_dirinfo[1] = 0x06;
		      pce_cd_dirinfo[2] = 0x00;
		    }		// switch CD emulation

		  pce_cd_read_datacnt = 3;
		  cd_read_buffer = pce_cd_dirinfo;

		  break;

		}		// switch command of request 0xde

	    }			// end if of request 0xde (receiving command or executing them)

	}			// switch of request

    }				// end if of command arg or new request
  else
    {

      // it's a command ID we're receiving

#ifdef CD_DEBUG
      fprintf (stderr, "Command byte received: 0x%02x.\n", io.cd_port_1801);
#endif

      switch (io.cd_port_1801)
	{
	case 0x00:
	  io.cd_port_1800 = 0xD8;
	  break;
	case 0x08:
	  pce_cd_curcmd = io.cd_port_1801;
	  pce_cd_cmdcnt = 4;
	  break;
	case 0xD8:
	  pce_cd_curcmd = io.cd_port_1801;
	  pce_cd_cmdcnt = 4;
	  break;
	case 0xD9:
	  pce_cd_curcmd = io.cd_port_1801;
	  pce_cd_cmdcnt = 4;
	  break;
	case 0xDA:
	  pce_cd_curcmd = io.cd_port_1801;
	  pce_cd_cmdcnt = 0;

	  if (CD_emulation == 1)
	    osd_cd_stop_audio ();
	  else if (CD_emulation == 5)
	    HCD_pause_playing ();

	  break;
	case 0xDE:
	  /* Get CD directory info */
	  /* First arg is command? */
	  /* Second arg is track? */
	  io.cd_port_1800 = 0xd0;
	  pce_cd_cmdcnt = 2;
	  pce_cd_read_datacnt = 3;	/* 4 bytes */
	  pce_cd_curcmd = io.cd_port_1801;
	  break;
	}

/*
        if (cd_port_1801 == 0x00) {
            cd_port_1800 = 0xd8;
        } else if (cd_port_1801 == 0x08) {
            pce_cd_curcmd = cd_port_1801;
            pce_cd_cmdcnt = 4;
        } else if (cd_port_1801 == 0xd8) {
            pce_cd_cmdcnt = 4;
            pce_cd_curcmd = cd_port_1801;
        } else if (cd_port_1801 == 0xd9) {
            pce_cd_cmdcnt = 4;
            pce_cd_curcmd = cd_port_1801;
        } else if (cd_port_1801 == 0xde) {
            // Get CD directory info
            // First arg is command?
            // Second arg is track?
            cd_port_1800 = 0xd0;
            pce_cd_cmdcnt = 2;
            pce_cd_read_datacnt = 3; // 4 bytes
            pce_cd_curcmd = cd_port_1801;
        }
*/

    }
}