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; }
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); } }
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); }
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; } */ } }