nonacc mode removal, function return value audit

git-svn-id: file:///home/notaz/opt/svn/PicoDrive@510 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
notaz 2008-07-01 14:32:09 +00:00
parent b6d7ac7090
commit 2aa27095f2
18 changed files with 67 additions and 378 deletions

View file

@ -44,7 +44,7 @@ static int ScanVar(void *data,int len,char *name,void *PmovFile,int PmovAction)
#define SCANP(x) ScanVar(&Pico.x,sizeof(Pico.x),#x,PmovFile,PmovAction); #define SCANP(x) ScanVar(&Pico.x,sizeof(Pico.x),#x,PmovFile,PmovAction);
// Pack the cpu into a common format: // Pack the cpu into a common format:
PICO_INTERNAL int PicoAreaPackCpu(unsigned char *cpu, int is_sub) PICO_INTERNAL void PicoAreaPackCpu(unsigned char *cpu, int is_sub)
{ {
unsigned int pc=0; unsigned int pc=0;
@ -77,10 +77,9 @@ PICO_INTERNAL int PicoAreaPackCpu(unsigned char *cpu, int is_sub)
#endif #endif
*(unsigned int *)(cpu+0x40)=pc; *(unsigned int *)(cpu+0x40)=pc;
return 0;
} }
PICO_INTERNAL int PicoAreaUnpackCpu(unsigned char *cpu, int is_sub) PICO_INTERNAL void PicoAreaUnpackCpu(unsigned char *cpu, int is_sub)
{ {
#if defined(EMU_C68K) #if defined(EMU_C68K)
struct Cyclone *context = is_sub ? &PicoCpuCS68k : &PicoCpuCM68k; struct Cyclone *context = is_sub ? &PicoCpuCS68k : &PicoCpuCM68k;
@ -113,7 +112,6 @@ PICO_INTERNAL int PicoAreaUnpackCpu(unsigned char *cpu, int is_sub)
context->execinfo &= ~FM68K_HALTED; context->execinfo &= ~FM68K_HALTED;
if (cpu[0x4d]&1) context->execinfo |= FM68K_HALTED; if (cpu[0x4d]&1) context->execinfo |= FM68K_HALTED;
#endif #endif
return 0;
} }
// Scan the contents of the virtual machine's memory for saving or loading // Scan the contents of the virtual machine's memory for saving or loading

View file

@ -545,14 +545,13 @@ int PicoCartInsert(unsigned char *rom,unsigned int romsize)
return 0; return 0;
} }
int PicoCartUnload(void) void PicoCartUnload(void)
{ {
if (Pico.rom != NULL) { if (Pico.rom != NULL) {
SekFinishIdleDet(); SekFinishIdleDet();
free(Pico.rom); free(Pico.rom);
Pico.rom=NULL; Pico.rom=NULL;
} }
return 0;
} }
static int rom_strcmp(int rom_offset, const char *s1) static int rom_strcmp(int rom_offset, const char *s1)

View file

@ -89,10 +89,9 @@ PICO_INTERNAL u32 PicoCheckPc(u32 pc)
} }
PICO_INTERNAL int PicoInitPc(u32 pc) PICO_INTERNAL void PicoInitPc(u32 pc)
{ {
PicoCheckPc(pc); PicoCheckPc(pc);
return 0;
} }
#ifndef _ASM_MEMORY_C #ifndef _ASM_MEMORY_C
@ -689,8 +688,6 @@ static void m68k_mem_setup(void)
// ----------------------------------------------------------------- // -----------------------------------------------------------------
extern const unsigned short vcounts[];
static int get_scanline(int is_from_z80) static int get_scanline(int is_from_z80)
{ {
if (is_from_z80) { if (is_from_z80) {
@ -700,10 +697,7 @@ static int get_scanline(int is_from_z80)
return z80_scanline; return z80_scanline;
} }
if (Pico.m.scanline != -1) return Pico.m.scanline;
return Pico.m.scanline;
return vcounts[SekCyclesDone()>>8];
} }
/* probably not should be in this file, but it's near related code here */ /* probably not should be in this file, but it's near related code here */

View file

@ -46,7 +46,7 @@ static
u32 z80ReadBusReq(void) u32 z80ReadBusReq(void)
{ {
u32 d=Pico.m.z80Run&1; u32 d=Pico.m.z80Run&1;
if (!d && Pico.m.scanline != -1) { if (!d) {
// needed by buggy Terminator (Sega CD) // needed by buggy Terminator (Sega CD)
int stop_before = SekCyclesDone() - z80stopCycle; int stop_before = SekCyclesDone() - z80stopCycle;
//elprintf(EL_BUSREQ, "get_zrun: stop before: %i", stop_before); //elprintf(EL_BUSREQ, "get_zrun: stop before: %i", stop_before);
@ -55,7 +55,7 @@ u32 z80ReadBusReq(void)
if (stop_before > 0 && stop_before < 20) // Gens uses 16 here if (stop_before > 0 && stop_before < 20) // Gens uses 16 here
d = 1; // bus not yet available d = 1; // bus not yet available
} }
// |=0x80 for Shadow of the Beast & Super Offroad
elprintf(EL_BUSREQ, "get_zrun: %02x [%i] @%06x", d|0x80, SekCyclesDone(), SekPc); elprintf(EL_BUSREQ, "get_zrun: %02x [%i] @%06x", d|0x80, SekCyclesDone(), SekPc);
return d|0x80; return d|0x80;
} }

View file

@ -85,48 +85,6 @@ const unsigned char hcounts_32[] = {
0x0a,0x0b,0x0b,0x0b,0x0c,0x0c,0x0c,0x0d, 0x0a,0x0b,0x0b,0x0b,0x0c,0x0c,0x0c,0x0d,
}; };
// vcounter values for PicoFrameSimple
const unsigned short vcounts[] = {
0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7,
8, 8, 9, 9, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16,
16, 17, 17, 18, 18, 19, 19, 20, 21, 21, 22, 22, 23, 23, 24, 24,
25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 31, 31, 32, 32, 33,
33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 40, 40, 41,
42, 42, 43, 43, 44, 44, 45, 45, 46, 46, 47, 47, 48, 48, 49, 49,
50, 50, 51, 52, 52, 53, 53, 54, 54, 55, 55, 56, 56, 57, 57, 58,
58, 59, 59, 60, 60, 61, 62, 62, 63, 63, 64, 64, 65, 65, 66, 66,
67, 67, 68, 68, 69, 69, 70, 70, 71, 71, 72, 73, 73, 74, 74, 75,
75, 76, 76, 77, 77, 78, 78, 79, 79, 80, 80, 81, 81, 82, 83, 83,
84, 84, 85, 85, 86, 86, 87, 87, 88, 88, 89, 89, 90, 90, 91, 91,
92, 93, 93, 94, 94, 95, 95, 96, 96, 97, 97, 98, 98, 99, 99,100,
100,101,101,102,102,103,104,104,105,105,106,106,107,107,108,108,
109,109,110,110,111,111,112,112,113,114,114,115,115,116,116,117,
117,118,118,119,119,120,120,121,121,122,122,123,124,124,125,125,
126,126,127,127,128,128,129,129,130,130,131,131,132,132,133,133,
134,135,135,136,136,137,137,138,138,139,139,140,140,141,141,142,
142,143,143,144,145,145,146,146,147,147,148,148,149,149,150,150,
151,151,152,152,153,153,154,155,155,156,156,157,157,158,158,159,
159,160,160,161,161,162,162,163,163,164,164,165,166,166,167,167,
168,168,169,169,170,170,171,171,172,172,173,173,174,174,175,176,
176,177,177,178,178,179,179,180,180,181,181,182,182,183,183,184,
184,185,186,186,187,187,188,188,189,189,190,190,191,191,192,192,
193,193,194,194,195,195,196,197,197,198,198,199,199,200,200,201,
201,202,202,203,203,204,204,205,205,206,207,207,208,208,209,209,
210,210,211,211,212,212,213,213,214,214,215,215,216,217,217,218,
218,219,219,220,220,221,221,222,222,223,223,224,224,225,225,226,
226,227,228,228,229,229,230,230,231,231,232,232,233,233,234,234,
235,235,236,236,237,238,238,239,239,240,240,241,241,242,242,243,
243,244,244,245,245,246,246,247,248,248,249,249,250,250,251,251,
252,252,253,253,254,254,255,255,256,256,257,257,258,259,259,260,
260,261,261,262,262,263,263,264,264,265,265,266,266,267,267,268,
269,269,270,270,271,271,272,272,273,273,274,274,275,275,276,276,
277,277,278,279,279,280,280,281,281,282,282,283,283,284,284,285,
285,286,286,287,287,288,288,289,290,290,291,291,292,292,293,293,
294,294,295,295,296,296,297,297,298,298,299,300,300,301,301,302,
302,303,303,304,304,305,305,306,306,307,307,308,308,309,310,310,
311,311,311,311,
};
// rarely used EEPROM SRAM code // rarely used EEPROM SRAM code
// known games which use this: // known games which use this:

View file

@ -26,7 +26,7 @@ void (*PicoResetHook)(void) = NULL;
void (*PicoLineHook)(int count) = NULL; void (*PicoLineHook)(int count) = NULL;
// to be called once on emu init // to be called once on emu init
int PicoInit(void) void PicoInit(void)
{ {
// Blank space for state: // Blank space for state:
memset(&Pico,0,sizeof(Pico)); memset(&Pico,0,sizeof(Pico));
@ -40,8 +40,6 @@ int PicoInit(void)
PicoSVPInit(); PicoSVPInit();
SRam.data=0; SRam.data=0;
return 0;
} }
// to be called once on emu exit // to be called once on emu exit
@ -255,36 +253,6 @@ static __inline void SekRunM68k(int cyc)
#endif #endif
} }
static __inline void SekStep(void)
{
// this is required for timing sensitive stuff to work
int realaim=SekCycleAim; SekCycleAim=SekCycleCnt+1;
#if defined(EMU_CORE_DEBUG)
SekCycleCnt+=CM_compareRun(1, 0);
#elif defined(EMU_C68K)
PicoCpuCM68k.cycles=1;
CycloneRun(&PicoCpuCM68k);
SekCycleCnt+=1-PicoCpuCM68k.cycles;
#elif defined(EMU_M68K)
SekCycleCnt+=m68k_execute(1);
#elif defined(EMU_F68K)
SekCycleCnt+=fm68k_emulate(1, 0);
#endif
SekCycleAim=realaim;
}
static int CheckIdle(void)
{
int i, state[0x24];
// See if the state is the same after 2 steps:
SekState(state); SekStep(); SekStep(); SekState(state+0x12);
for (i = 0x11; i >= 0; i--)
if (state[i] != state[i+0x12]) return 0;
return 1;
}
// to be called on 224 or line_sample scanlines only // to be called on 224 or line_sample scanlines only
static __inline void getSamples(int y) static __inline void getSamples(int y)
@ -339,216 +307,36 @@ PICO_INTERNAL void PicoSyncZ80(int m68k_cycles_done)
} }
// Simple frame without H-Ints
static int PicoFrameSimple(void)
{
struct PicoVideo *pv=&Pico.video;
int y=0,lines_step=0,sects,line_last;
int cycles_68k_vblock,cycles_68k_block;
// split to 16 run calls for active scan, for vblank split to 2 (ntsc), 3 (pal 240), 4 (pal 224)
if (Pico.m.pal)
{
if(pv->reg[1]&8) { // 240 lines
cycles_68k_block = 7308;
cycles_68k_vblock = 11694;
lines_step = 15;
} else {
cycles_68k_block = 6821;
cycles_68k_vblock = 10719;
lines_step = 14;
}
line_last = 312-1;
} else {
// M68k cycles/frame: 127840.71
cycles_68k_block = 6841; // (488*224+148)/16.0, -4
cycles_68k_vblock = 9164; // (38*488-148-68)/2.0, 0
lines_step = 14;
line_last = 262-1;
}
// a hack for VR, to get it running in fast mode
if (PicoAHW & PAHW_SVP)
Pico.ram[0xd864^1] = 0x1a;
// we don't emulate DMA timing in this mode
if (Pico.m.dma_xfers) {
Pico.m.dma_xfers=0;
Pico.video.status&=~2;
}
// VDP FIFO too
pv->lwrite_cnt = 0;
Pico.video.status|=0x200;
Pico.m.scanline=-1;
PsndDacLine = 0;
SekCyclesReset();
z80_resetCycles();
// 6 button pad: let's just say it timed out now
Pico.m.padTHPhase[0]=Pico.m.padTHPhase[1]=0;
// ---- Active Scan ----
pv->status&=~0x88; // clear V-Int, come out of vblank
// Run in sections:
for (sects=16; sects; sects--)
{
if (CheckIdle()) break;
SekRunM68k(cycles_68k_block);
if (PicoLineHook) PicoLineHook(lines_step);
}
// do remaining sections without 68k
if (sects) {
SekCycleCnt += sects * cycles_68k_block;
SekCycleAim += sects * cycles_68k_block;
if (PicoLineHook) PicoLineHook(sects*lines_step);
}
// another hack for VR (it needs hints to work)
if (PicoAHW & PAHW_SVP) {
Pico.ram[0xd864^1] = 1;
pv->pending_ints|=0x10;
if (pv->reg[0]&0x10) SekInterrupt(4);
SekRunM68k(160);
}
// render screen
if (!PicoSkipFrame)
{
if (!(PicoOpt&POPT_ALT_RENDERER))
{
// Draw the screen
#if 0
#if CAN_HANDLE_240_LINES
if (pv->reg[1]&8) {
for (y=0;y<240;y++) PicoLine(y);
} else {
for (y=0;y<224;y++) PicoLine(y);
}
#else
for (y=0;y<224;y++) PicoLine(y);
#endif
#endif
}
else PicoFrameFull();
#ifdef DRAW_FINISH_FUNC
DRAW_FINISH_FUNC();
#endif
}
// a gap between flags set and vint
pv->pending_ints|=0x20;
pv->status|=8; // go into vblank
SekRunM68k(68+4);
if (Pico.m.z80Run && (PicoOpt&POPT_EN_Z80))
PicoSyncZ80(SekCycleCnt);
// render sound
if (PsndOut)
{
int len;
if (ym2612.dacen && PsndDacLine <= lines_step*16)
PsndDoDAC(lines_step*16);
len = PsndRender(0, PsndLen);
if (PicoWriteSound) PicoWriteSound(len);
// clear sound buffer
PsndClear();
}
// ---- V-Blanking period ----
// fix line counts
if(Pico.m.pal) {
if(pv->reg[1]&8) { // 240 lines
sects = 3;
lines_step = 24;
} else {
sects = 4;
lines_step = 22;
}
} else {
sects = 2;
lines_step = 19;
}
if (pv->reg[1]&0x20) SekInterrupt(6); // Set IRQ
if (Pico.m.z80Run && (PicoOpt&POPT_EN_Z80))
z80_int();
while (1)
{
SekRunM68k(cycles_68k_vblock);
if (PicoLineHook) PicoLineHook(lines_step);
sects--;
if (sects == 0) break;
if (CheckIdle()) break;
}
if (sects) {
SekCycleCnt += sects * cycles_68k_vblock;
SekCycleAim += sects * cycles_68k_vblock;
if (PicoLineHook) PicoLineHook(sects*lines_step);
}
// must sync z80 before return, and extend last DAC sample
if (Pico.m.z80Run && (PicoOpt&POPT_EN_Z80))
PicoSyncZ80(SekCycleCnt);
if (PsndOut && ym2612.dacen && PsndDacLine <= line_last)
PsndDoDAC(line_last);
timers_cycle();
return 0;
}
int idle_hit_counter = 0; int idle_hit_counter = 0;
int PicoFrame(void) void PicoFrame(void)
{ {
int acc; #if 0
if ((Pico.m.frame_count&0x3f) == 0) { if ((Pico.m.frame_count&0x3f) == 0) {
elprintf(EL_STATUS, "ihits: %i", idle_hit_counter); elprintf(EL_STATUS, "ihits: %i", idle_hit_counter);
idle_hit_counter = 0; idle_hit_counter = 0;
} }
#endif
Pico.m.frame_count++; Pico.m.frame_count++;
if (PicoAHW & PAHW_MCD) { if (PicoAHW & PAHW_MCD) {
PicoFrameMCD(); PicoFrameMCD();
return 0; return;
} }
// be accurate if we are asked for this
if (PicoOpt&POPT_ACC_TIMING) acc=1;
// don't be accurate in alternative render mode, as hint effects will not be rendered anyway
else if (PicoOpt&POPT_ALT_RENDERER) acc = 0;
else acc=Pico.video.reg[0]&0x10; // be accurate if hints are used
//if(Pico.video.reg[12]&0x2) Pico.video.status ^= 0x10; // change odd bit in interlace mode //if(Pico.video.reg[12]&0x2) Pico.video.status ^= 0x10; // change odd bit in interlace mode
if (!(PicoOpt&POPT_ALT_RENDERER)) if (!(PicoOpt&POPT_ALT_RENDERER))
PicoFrameStart(); PicoFrameStart();
if (acc) PicoFrameHints();
PicoFrameHints();
else PicoFrameSimple();
return 0;
} }
void PicoFrameDrawOnly(void) void PicoFrameDrawOnly(void)
{ {
int y;
PicoFrameStart(); PicoFrameStart();
for (y=0;y<224;y++) PicoLine(y); PicoDrawSync(223, 0);
} }
void PicoGetInternal(pint_t which, pint_ret_t *r) void PicoGetInternal(pint_t which, pint_ret_t *r)

View file

@ -34,7 +34,7 @@ void mp3_update(int *buffer, int length, int stereo);
#define POPT_EN_STEREO (1<< 3) #define POPT_EN_STEREO (1<< 3)
#define POPT_ALT_RENDERER (1<< 4) // 00 00x0 #define POPT_ALT_RENDERER (1<< 4) // 00 00x0
#define POPT_6BTN_PAD (1<< 5) #define POPT_6BTN_PAD (1<< 5)
#define POPT_ACC_TIMING (1<< 6) // unused (1<< 6)
#define POPT_ACC_SPRITES (1<< 7) #define POPT_ACC_SPRITES (1<< 7)
#define POPT_DIS_32C_BORDER (1<< 8) // 00 0x00 #define POPT_DIS_32C_BORDER (1<< 8) // 00 0x00
#define POPT_EXT_FM (1<< 9) #define POPT_EXT_FM (1<< 9)
@ -59,11 +59,11 @@ extern int PicoSkipFrame; // skip rendering frame, but still do sound (if e
extern int PicoRegionOverride; // override the region detection 0: auto, 1: Japan NTSC, 2: Japan PAL, 4: US, 8: Europe extern int PicoRegionOverride; // override the region detection 0: auto, 1: Japan NTSC, 2: Japan PAL, 4: US, 8: Europe
extern int PicoAutoRgnOrder; // packed priority list of regions, for example 0x148 means this detection order: EUR, USA, JAP extern int PicoAutoRgnOrder; // packed priority list of regions, for example 0x148 means this detection order: EUR, USA, JAP
extern int PicoSVPCycles; extern int PicoSVPCycles;
int PicoInit(void); void PicoInit(void);
void PicoExit(void); void PicoExit(void);
void PicoPower(void); void PicoPower(void);
int PicoReset(void); int PicoReset(void);
int PicoFrame(void); void PicoFrame(void);
void PicoFrameDrawOnly(void); void PicoFrameDrawOnly(void);
extern int PicoPad[2]; // Joypads, format is MXYZ SACB RLDU extern int PicoPad[2]; // Joypads, format is MXYZ SACB RLDU
extern void (*PicoWriteSound)(int len); // called once per frame at the best time to send sound buffer (PsndOut) to hardware extern void (*PicoWriteSound)(int len); // called once per frame at the best time to send sound buffer (PsndOut) to hardware
@ -109,7 +109,7 @@ extern areaclose *areaClose;
extern void (*PicoStateProgressCB)(const char *str); extern void (*PicoStateProgressCB)(const char *str);
// cd/Area.c // cd/Area.c
int PicoCdLoadStateGfx(void *file); int PicoCdLoadStateGfx(void *file);
// cd/buffering.c // cd/buffering.c
void PicoCDBufferInit(void); void PicoCDBufferInit(void);
@ -117,7 +117,6 @@ void PicoCDBufferFree(void);
void PicoCDBufferFlush(void); void PicoCDBufferFlush(void);
// cd/cd_sys.c // cd/cd_sys.c
int Insert_CD(char *iso_name, int is_bin);
int Insert_CD(char *cdimg_name, int type); int Insert_CD(char *cdimg_name, int type);
void Stop_CD(void); // releases all resources taken when CD game was started. void Stop_CD(void); // releases all resources taken when CD game was started.
@ -142,7 +141,7 @@ int pm_close(pm_file *fp);
int PicoCartLoad(pm_file *f,unsigned char **prom,unsigned int *psize); int PicoCartLoad(pm_file *f,unsigned char **prom,unsigned int *psize);
int PicoCartInsert(unsigned char *rom,unsigned int romsize); int PicoCartInsert(unsigned char *rom,unsigned int romsize);
void Byteswap(unsigned char *data,int len); void Byteswap(unsigned char *data,int len);
int PicoCartUnload(void); void PicoCartUnload(void);
extern void (*PicoCartLoadProgressCB)(int percent); extern void (*PicoCartLoadProgressCB)(int percent);
extern void (*PicoCDLoadProgressCB)(int percent); extern void (*PicoCDLoadProgressCB)(int percent);

View file

@ -73,7 +73,7 @@ static void PicoResetPico(void)
PicoPicohw.xpcm_ptr = PicoPicohw.xpcm_buffer; PicoPicohw.xpcm_ptr = PicoPicohw.xpcm_buffer;
} }
PICO_INTERNAL int PicoInitPico(void) PICO_INTERNAL void PicoInitPico(void)
{ {
elprintf(EL_STATUS, "Pico detected"); elprintf(EL_STATUS, "Pico detected");
PicoLineHook = PicoLinePico; PicoLineHook = PicoLinePico;
@ -93,7 +93,5 @@ PICO_INTERNAL int PicoInitPico(void)
case 2: PicoPicohw.r1 = 0x40; break; case 2: PicoPicohw.r1 = 0x40; break;
case 3: PicoPicohw.r1 = 0x20; break; case 3: PicoPicohw.r1 = 0x20; break;
} }
return 0;
} }

View file

@ -38,7 +38,7 @@ static int PicoFrameHints(void)
int lines, y, lines_vis = 224, line_sample, skip; int lines, y, lines_vis = 224, line_sample, skip;
int hint; // Hint counter int hint; // Hint counter
Pico.m.scanline=0; Pico.m.scanline = 0;
if ((PicoOpt&POPT_ALT_RENDERER) && !PicoSkipFrame && (pv->reg[1]&0x40)) { // fast rend., display enabled if ((PicoOpt&POPT_ALT_RENDERER) && !PicoSkipFrame && (pv->reg[1]&0x40)) { // fast rend., display enabled
// draw a frame just after vblank in alternative render mode // draw a frame just after vblank in alternative render mode
@ -75,7 +75,7 @@ static int PicoFrameHints(void)
for (y = 0; y < lines_vis; y++) for (y = 0; y < lines_vis; y++)
{ {
Pico.m.scanline=(short)y; Pico.m.scanline = y;
// VDP FIFO // VDP FIFO
pv->lwrite_cnt -= 12; pv->lwrite_cnt -= 12;
@ -148,7 +148,7 @@ static int PicoFrameHints(void)
} }
// V-int line (224 or 240) // V-int line (224 or 240)
Pico.m.scanline=(short)y; Pico.m.scanline = y;
// VDP FIFO // VDP FIFO
pv->lwrite_cnt=0; pv->lwrite_cnt=0;
@ -215,7 +215,7 @@ static int PicoFrameHints(void)
for (y++; y < lines; y++) for (y++; y < lines; y++)
{ {
Pico.m.scanline=(short)y; Pico.m.scanline = y;
PAD_DELAY PAD_DELAY
#ifdef PICO_CD #ifdef PICO_CD

View file

@ -245,7 +245,7 @@ struct PicoMisc
unsigned char rotate; unsigned char rotate;
unsigned char z80Run; unsigned char z80Run;
unsigned char padTHPhase[2]; // 02 phase of gamepad TH switches unsigned char padTHPhase[2]; // 02 phase of gamepad TH switches
short scanline; // 04 0 to 261||311; -1 in fast mode unsigned short scanline; // 04 0 to 261||311
char dirtyPal; // 06 Is the palette dirty (1 - change @ this frame, 2 - some time before) char dirtyPal; // 06 Is the palette dirty (1 - change @ this frame, 2 - some time before)
unsigned char hardware; // 07 Hardware value for country unsigned char hardware; // 07 Hardware value for country
unsigned char pal; // 08 1=PAL 0=NTSC unsigned char pal; // 08 1=PAL 0=NTSC
@ -371,8 +371,8 @@ typedef struct
// Area.c // Area.c
PICO_INTERNAL int PicoAreaPackCpu(unsigned char *cpu, int is_sub); PICO_INTERNAL void PicoAreaPackCpu(unsigned char *cpu, int is_sub);
PICO_INTERNAL int PicoAreaUnpackCpu(unsigned char *cpu, int is_sub); PICO_INTERNAL void PicoAreaUnpackCpu(unsigned char *cpu, int is_sub);
extern void (*PicoLoadStateHook)(void); extern void (*PicoLoadStateHook)(void);
// cd/Area.c // cd/Area.c
@ -402,7 +402,7 @@ extern int DrawScanline;
PICO_INTERNAL void PicoFrameFull(); PICO_INTERNAL void PicoFrameFull();
// Memory.c // Memory.c
PICO_INTERNAL int PicoInitPc(unsigned int pc); PICO_INTERNAL void PicoInitPc(unsigned int pc);
PICO_INTERNAL unsigned int PicoCheckPc(unsigned int pc); PICO_INTERNAL unsigned int PicoCheckPc(unsigned int pc);
PICO_INTERNAL_ASM unsigned int PicoRead32(unsigned int a); PICO_INTERNAL_ASM unsigned int PicoRead32(unsigned int a);
PICO_INTERNAL void PicoMemSetup(void); PICO_INTERNAL void PicoMemSetup(void);
@ -442,14 +442,14 @@ PICO_INTERNAL void PicoDetectRegion(void);
PICO_INTERNAL void PicoSyncZ80(int m68k_cycles_done); PICO_INTERNAL void PicoSyncZ80(int m68k_cycles_done);
// cd/Pico.c // cd/Pico.c
PICO_INTERNAL int PicoInitMCD(void); PICO_INTERNAL void PicoInitMCD(void);
PICO_INTERNAL void PicoExitMCD(void); PICO_INTERNAL void PicoExitMCD(void);
PICO_INTERNAL void PicoPowerMCD(void); PICO_INTERNAL void PicoPowerMCD(void);
PICO_INTERNAL int PicoResetMCD(void); PICO_INTERNAL int PicoResetMCD(void);
PICO_INTERNAL int PicoFrameMCD(void); PICO_INTERNAL void PicoFrameMCD(void);
// Pico/Pico.c // Pico/Pico.c
PICO_INTERNAL int PicoInitPico(void); PICO_INTERNAL void PicoInitPico(void);
PICO_INTERNAL void PicoReratePico(void); PICO_INTERNAL void PicoReratePico(void);
// Pico/xpcm.c // Pico/xpcm.c
@ -458,17 +458,17 @@ PICO_INTERNAL void PicoPicoPCMReset(void);
PICO_INTERNAL void PicoPicoPCMRerate(int xpcm_rate); PICO_INTERNAL void PicoPicoPCMRerate(int xpcm_rate);
// Sek.c // Sek.c
PICO_INTERNAL int SekInit(void); PICO_INTERNAL void SekInit(void);
PICO_INTERNAL int SekReset(void); PICO_INTERNAL int SekReset(void);
PICO_INTERNAL void SekState(int *data); PICO_INTERNAL void SekState(int *data);
PICO_INTERNAL void SekSetRealTAS(int use_real); PICO_INTERNAL void SekSetRealTAS(int use_real);
void SekInitIdleDet(void); void SekInitIdleDet(void);
void SekFinishIdleDet(void); void SekFinishIdleDet(void);
// cd/Sek.c // cd/Sek.c
PICO_INTERNAL int SekInitS68k(void); PICO_INTERNAL void SekInitS68k(void);
PICO_INTERNAL int SekResetS68k(void); PICO_INTERNAL int SekResetS68k(void);
PICO_INTERNAL int SekInterruptS68k(int irq); PICO_INTERNAL int SekInterruptS68k(int irq);
// sound/sound.c // sound/sound.c
PICO_INTERNAL void cdda_start_play(); PICO_INTERNAL void cdda_start_play();

View file

@ -96,7 +96,7 @@ static void SekIntAckF68K(unsigned level)
#endif #endif
PICO_INTERNAL int SekInit() PICO_INTERNAL void SekInit(void)
{ {
#ifdef EMU_C68K #ifdef EMU_C68K
CycloneInit(); CycloneInit();
@ -129,13 +129,11 @@ PICO_INTERNAL int SekInit()
g_m68kcontext = oldcontext; g_m68kcontext = oldcontext;
} }
#endif #endif
return 0;
} }
// Reset the 68000: // Reset the 68000:
PICO_INTERNAL int SekReset() PICO_INTERNAL int SekReset(void)
{ {
if (Pico.rom==NULL) return 1; if (Pico.rom==NULL) return 1;
@ -166,23 +164,6 @@ PICO_INTERNAL int SekReset()
} }
// data must be word aligned
PICO_INTERNAL void SekState(int *data)
{
#ifdef EMU_C68K
memcpy32(data,(int *)PicoCpuCM68k.d,0x44/4);
data[0x11] = PicoCpuCM68k.flags;
#elif defined(EMU_M68K)
memcpy32(data, (int *)PicoCpuMM68k.dar, 0x40/4);
data[0x10] = PicoCpuMM68k.pc;
data[0x11] = m68k_get_reg(&PicoCpuMM68k, M68K_REG_SR);
#elif defined(EMU_F68K)
memcpy32(data, (int *)PicoCpuFM68k.dreg, 0x40/4);
data[0x10] = PicoCpuFM68k.pc;
data[0x11] = PicoCpuFM68k.sr;
#endif
}
PICO_INTERNAL void SekSetRealTAS(int use_real) PICO_INTERNAL void SekSetRealTAS(int use_real)
{ {
#ifdef EMU_C68K #ifdef EMU_C68K

View file

@ -12,7 +12,6 @@
extern const unsigned char hcounts_32[]; extern const unsigned char hcounts_32[];
extern const unsigned char hcounts_40[]; extern const unsigned char hcounts_40[];
extern const unsigned short vcounts[];
#ifndef UTYPES_DEFINED #ifndef UTYPES_DEFINED
typedef unsigned char u8; typedef unsigned char u8;
@ -43,7 +42,6 @@ static void VideoWrite(u16 d)
//default:elprintf(EL_ANOMALY, "VDP write %04x with bad type %i", d, Pico.video.type); break; //default:elprintf(EL_ANOMALY, "VDP write %04x with bad type %i", d, Pico.video.type); break;
} }
//dprintf("w[%i] @ %04x, inc=%i [%i|%i]", Pico.video.type, a, Pico.video.reg[0xf], Pico.m.scanline, SekCyclesDone());
AutoIncrement(); AutoIncrement();
} }
@ -92,14 +90,9 @@ static void DmaSlow(int len)
Pico.video.type, source, a, len, inc, (Pico.video.status&8)||!(Pico.video.reg[1]&0x40), Pico.video.type, source, a, len, inc, (Pico.video.status&8)||!(Pico.video.reg[1]&0x40),
SekCyclesDone(), SekPc); SekCyclesDone(), SekPc);
if (Pico.m.scanline != -1) { Pico.m.dma_xfers += len;
Pico.m.dma_xfers += len; if ((PicoAHW & PAHW_MCD) && (PicoOpt & POPT_EN_MCD_PSYNC)) SekCyclesBurn(CheckDMA());
if ((PicoAHW & PAHW_MCD) && (PicoOpt & POPT_EN_MCD_PSYNC)) SekCyclesBurn(CheckDMA()); else SekSetCyclesLeftNoMCD(SekCyclesLeftNoMCD - CheckDMA());
else SekSetCyclesLeftNoMCD(SekCyclesLeftNoMCD - CheckDMA());
} else {
// be approximate in non-accurate mode
SekSetCyclesLeft(SekCyclesLeft - (len*(((488<<8)/167))>>8));
}
if ((source&0xe00000)==0xe00000) { // Ram if ((source&0xe00000)==0xe00000) { // Ram
pd=(u16 *)(Pico.ram+(source&0xfffe)); pd=(u16 *)(Pico.ram+(source&0xfffe));
@ -230,16 +223,15 @@ static void DmaCopy(int len)
elprintf(EL_VDPDMA, "DmaCopy len %i [%i]", len, SekCyclesDone()); elprintf(EL_VDPDMA, "DmaCopy len %i [%i]", len, SekCyclesDone());
Pico.m.dma_xfers += len; Pico.m.dma_xfers += len;
if(Pico.m.scanline != -1) Pico.video.status |= 2; // dma busy
Pico.video.status|=2; // dma busy
source =Pico.video.reg[0x15]; source =Pico.video.reg[0x15];
source|=Pico.video.reg[0x16]<<8; source|=Pico.video.reg[0x16]<<8;
vrs=vr+source; vrs=vr+source;
if(source+len > 0x10000) len=0x10000-source; // clip?? if (source+len > 0x10000) len=0x10000-source; // clip??
for(;len;len--) for (; len; len--)
{ {
vr[a] = *vrs++; vr[a] = *vrs++;
// AutoIncrement // AutoIncrement
@ -264,17 +256,16 @@ static void DmaFill(int data)
elprintf(EL_VDPDMA, "DmaFill len %i inc %i [%i]", len, inc, SekCyclesDone()); elprintf(EL_VDPDMA, "DmaFill len %i inc %i [%i]", len, inc, SekCyclesDone());
Pico.m.dma_xfers += len; Pico.m.dma_xfers += len;
if(Pico.m.scanline != -1) Pico.video.status |= 2; // dma busy
Pico.video.status|=2; // dma busy (in accurate mode)
// from Charles MacDonald's genvdp.txt: // from Charles MacDonald's genvdp.txt:
// Write lower byte to address specified // Write lower byte to address specified
vr[a] = (unsigned char) data; vr[a] = (unsigned char) data;
a=(u16)(a+inc); a=(u16)(a+inc);
if(!inc) len=1; if (!inc) len=1;
for(;len;len--) { for (; len; len--) {
// Write upper byte to adjacent address // Write upper byte to adjacent address
// (here we are byteswapped, so address is already 'adjacent') // (here we are byteswapped, so address is already 'adjacent')
vr[a] = high; vr[a] = high;
@ -327,7 +318,7 @@ static __inline void DrawSync(int blank_on)
{ {
if (Pico.m.scanline < 224 && !(PicoOpt & POPT_ALT_RENDERER) && if (Pico.m.scanline < 224 && !(PicoOpt & POPT_ALT_RENDERER) &&
!PicoSkipFrame && DrawScanline <= Pico.m.scanline) { !PicoSkipFrame && DrawScanline <= Pico.m.scanline) {
elprintf(EL_ANOMALY, "sync"); //elprintf(EL_ANOMALY, "sync");
PicoDrawSync(Pico.m.scanline, blank_on); PicoDrawSync(Pico.m.scanline, blank_on);
} }
} }
@ -336,8 +327,8 @@ PICO_INTERNAL_ASM void PicoVideoWrite(unsigned int a,unsigned short d)
{ {
struct PicoVideo *pvid=&Pico.video; struct PicoVideo *pvid=&Pico.video;
if (Pico.m.scanline < 224) //if (Pico.m.scanline < 224)
elprintf(EL_STATUS, "PicoVideoWrite [%06x] %04x", a, d); // elprintf(EL_STATUS, "PicoVideoWrite [%06x] %04x", a, d);
a&=0x1c; a&=0x1c;
if (a==0x00) // Data port 0 or 2 if (a==0x00) // Data port 0 or 2
@ -362,7 +353,7 @@ PICO_INTERNAL_ASM void PicoVideoWrite(unsigned int a,unsigned short d)
else else
{ {
// preliminary FIFO emulation for Chaos Engine, The (E) // preliminary FIFO emulation for Chaos Engine, The (E)
if (!(pvid->status&8) && (pvid->reg[1]&0x40) && Pico.m.scanline!=-1 && !(PicoOpt&POPT_DIS_VDP_FIFO)) // active display, accurate mode? if (!(pvid->status&8) && (pvid->reg[1]&0x40) && !(PicoOpt&POPT_DIS_VDP_FIFO)) // active display?
{ {
pvid->status&=~0x200; // FIFO no longer empty pvid->status&=~0x200; // FIFO no longer empty
pvid->lwrite_cnt++; pvid->lwrite_cnt++;
@ -439,7 +430,7 @@ PICO_INTERNAL_ASM void PicoVideoWrite(unsigned int a,unsigned short d)
else if (pints & 0x10) irq = 4; else if (pints & 0x10) irq = 4;
SekInterrupt(irq); // update line SekInterrupt(irq); // update line
if (irq && Pico.m.scanline!=-1) SekEndRun(24); // make it delayed if (irq) SekEndRun(24); // make it delayed
} }
#endif #endif
} }
@ -499,30 +490,22 @@ PICO_INTERNAL_ASM unsigned int PicoVideoRead(unsigned int a)
if ((a&0x1c)==0x08) if ((a&0x1c)==0x08)
{ {
unsigned int hc, d; unsigned int hc, d;
int lineCycles;
lineCycles = (488-SekCyclesLeft)&0x1ff;
d = Pico.m.scanline; // V-Counter
if (Pico.m.scanline != -1) if (Pico.video.reg[12]&1)
{ hc=hcounts_40[lineCycles];
int lineCycles=(488-SekCyclesLeft)&0x1ff; else hc=hcounts_32[lineCycles];
d=Pico.m.scanline; // V-Counter
if(Pico.video.reg[12]&1) if (Pico.m.pal) {
hc=hcounts_40[lineCycles];
else hc=hcounts_32[lineCycles];
//if(lineCycles > 488-12) d++; // Wheel of Fortune
} else {
// get approximate V-Counter
d=vcounts[SekCyclesDone()>>8];
hc = Pico.m.rotate&0xff;
}
if(Pico.m.pal) {
if (d >= 0x103) d-=56; // based on Gens if (d >= 0x103) d-=56; // based on Gens
} else { } else {
if (d >= 0xEB) d-=6; if (d >= 0xEB) d-=6;
} }
if((Pico.video.reg[12]&6) == 6) { if ((Pico.video.reg[12]&6) == 6) {
// interlace mode 2 (Combat Cars (UE) [!]) // interlace mode 2 (Combat Cars (UE) [!])
d <<= 1; d <<= 1;
if (d&0xf00) d|= 1; if (d&0xf00) d|= 1;

View file

@ -31,12 +31,10 @@ int (*PicoMCDcloseTray)(void) = NULL;
} }
PICO_INTERNAL int PicoInitMCD(void) PICO_INTERNAL void PicoInitMCD(void)
{ {
SekInitS68k(); SekInitS68k();
Init_CD_Driver(); Init_CD_Driver();
return 0;
} }
@ -264,14 +262,12 @@ static __inline void getSamples(int y)
#include "../PicoFrameHints.c" #include "../PicoFrameHints.c"
PICO_INTERNAL int PicoFrameMCD(void) PICO_INTERNAL void PicoFrameMCD(void)
{ {
if (!(PicoOpt&POPT_ALT_RENDERER)) if (!(PicoOpt&POPT_ALT_RENDERER))
PicoFrameStart(); PicoFrameStart();
PicoFrameHints(); PicoFrameHints();
return 0;
} }

View file

@ -93,7 +93,7 @@ static void SekIntAckFS68k(unsigned level)
#endif #endif
PICO_INTERNAL int SekInitS68k() PICO_INTERNAL void SekInitS68k(void)
{ {
#ifdef EMU_C68K #ifdef EMU_C68K
// CycloneInit(); // CycloneInit();
@ -125,12 +125,10 @@ PICO_INTERNAL int SekInitS68k()
g_m68kcontext = oldcontext; g_m68kcontext = oldcontext;
} }
#endif #endif
return 0;
} }
// Reset the 68000: // Reset the 68000:
PICO_INTERNAL int SekResetS68k() PICO_INTERNAL int SekResetS68k(void)
{ {
if (Pico.rom==NULL) return 1; if (Pico.rom==NULL) return 1;

View file

@ -450,7 +450,7 @@ int emu_ReloadRom(void)
if(movie_data[0x14] == '6') if(movie_data[0x14] == '6')
PicoOpt |= POPT_6BTN_PAD; // 6 button pad PicoOpt |= POPT_6BTN_PAD; // 6 button pad
else PicoOpt &= ~POPT_6BTN_PAD; else PicoOpt &= ~POPT_6BTN_PAD;
PicoOpt |= POPT_DIS_VDP_FIFO|POPT_ACC_TIMING; // accurate timing, no VDP fifo timing PicoOpt |= POPT_DIS_VDP_FIFO; // no VDP fifo timing
if(movie_data[0xF] >= 'A') { if(movie_data[0xF] >= 'A') {
if(movie_data[0x16] & 0x80) { if(movie_data[0x16] & 0x80) {
PicoRegionOverride = 8; PicoRegionOverride = 8;

View file

@ -1045,7 +1045,6 @@ menu_entry opt_entries[] =
{ NULL, MB_NONE, MA_OPT_RENDERER, NULL, 0, 0, 0, 1 }, { NULL, MB_NONE, MA_OPT_RENDERER, NULL, 0, 0, 0, 1 },
{ "Scanline mode (faster)", MB_ONOFF, MA_OPT_INTERLACED, &currentConfig.EmuOpt, 0x4000, 0, 0, 1 }, { "Scanline mode (faster)", MB_ONOFF, MA_OPT_INTERLACED, &currentConfig.EmuOpt, 0x4000, 0, 0, 1 },
{ "Scale low res mode", MB_ONOFF, MA_OPT_SCALING, &currentConfig.scaling, 0x0001, 0, 3, 1 }, { "Scale low res mode", MB_ONOFF, MA_OPT_SCALING, &currentConfig.scaling, 0x0001, 0, 3, 1 },
{ "Accurate timing (slower)", MB_ONOFF, MA_OPT_ACC_TIMING, &currentConfig.PicoOpt, 0x0040, 0, 0, 1 },
{ "Accurate sprites (slower)", MB_ONOFF, MA_OPT_ACC_SPRITES, &currentConfig.PicoOpt, 0x0080, 0, 0, 1 }, { "Accurate sprites (slower)", MB_ONOFF, MA_OPT_ACC_SPRITES, &currentConfig.PicoOpt, 0x0080, 0, 0, 1 },
{ "Show FPS", MB_ONOFF, MA_OPT_SHOW_FPS, &currentConfig.EmuOpt, 0x0002, 0, 0, 1 }, { "Show FPS", MB_ONOFF, MA_OPT_SHOW_FPS, &currentConfig.EmuOpt, 0x0002, 0, 0, 1 },
{ NULL, MB_RANGE, MA_OPT_FRAMESKIP, &currentConfig.Frameskip, 0, -1, 16, 1 }, { NULL, MB_RANGE, MA_OPT_FRAMESKIP, &currentConfig.Frameskip, 0, -1, 16, 1 },

View file

@ -1150,7 +1150,6 @@ menu_entry opt_entries[] =
{ {
{ NULL, MB_NONE, MA_OPT_RENDERER, NULL, 0, 0, 0, 1, 1 }, { NULL, MB_NONE, MA_OPT_RENDERER, NULL, 0, 0, 0, 1, 1 },
{ NULL, MB_RANGE, MA_OPT_SCALING, &currentConfig.scaling, 0, 0, 3, 1, 1 }, { NULL, MB_RANGE, MA_OPT_SCALING, &currentConfig.scaling, 0, 0, 3, 1, 1 },
{ "Accurate timing (slower)", MB_ONOFF, MA_OPT_ACC_TIMING, &PicoOpt, 0x040, 0, 0, 1, 1 },
{ "Accurate sprites (slower)", MB_ONOFF, MA_OPT_ACC_SPRITES, &PicoOpt, 0x080, 0, 0, 1, 1 }, { "Accurate sprites (slower)", MB_ONOFF, MA_OPT_ACC_SPRITES, &PicoOpt, 0x080, 0, 0, 1, 1 },
{ "Show FPS", MB_ONOFF, MA_OPT_SHOW_FPS, &currentConfig.EmuOpt, 0x002, 0, 0, 1, 1 }, { "Show FPS", MB_ONOFF, MA_OPT_SHOW_FPS, &currentConfig.EmuOpt, 0x002, 0, 0, 1, 1 },
{ NULL, MB_RANGE, MA_OPT_FRAMESKIP, &currentConfig.Frameskip, 0, -1, 16, 1, 1 }, { NULL, MB_RANGE, MA_OPT_FRAMESKIP, &currentConfig.Frameskip, 0, -1, 16, 1, 1 },

View file

@ -1235,7 +1235,6 @@ static void amenu_loop_options(void)
menu_entry opt_entries[] = menu_entry opt_entries[] =
{ {
{ NULL, MB_NONE, MA_OPT_RENDERER, NULL, 0, 0, 0, 1, 1 }, { NULL, MB_NONE, MA_OPT_RENDERER, NULL, 0, 0, 0, 1, 1 },
{ "Accurate timing (slower)", MB_ONOFF, MA_OPT_ACC_TIMING, &PicoOpt, 0x0040, 0, 0, 1, 1 },
{ "Accurate sprites (slower)", MB_ONOFF, MA_OPT_ACC_SPRITES, &PicoOpt, 0x0080, 0, 0, 1, 1 }, { "Accurate sprites (slower)", MB_ONOFF, MA_OPT_ACC_SPRITES, &PicoOpt, 0x0080, 0, 0, 1, 1 },
{ "Show FPS", MB_ONOFF, MA_OPT_SHOW_FPS, &currentConfig.EmuOpt, 0x0002, 0, 0, 1, 1 }, { "Show FPS", MB_ONOFF, MA_OPT_SHOW_FPS, &currentConfig.EmuOpt, 0x0002, 0, 0, 1, 1 },
{ NULL, MB_RANGE, MA_OPT_FRAMESKIP, &currentConfig.Frameskip, 0, -1, 16, 1, 1 }, { NULL, MB_RANGE, MA_OPT_FRAMESKIP, &currentConfig.Frameskip, 0, -1, 16, 1, 1 },