#include <stdlib.h>\r
#include <string.h>\r
\r
+#ifdef GP2X\r
+#include <unistd.h> // for sync()\r
+#endif\r
+\r
#include "types.h"\r
#include "x6502.h"\r
#include "fce.h"\r
\r
#define DC_INC 1\r
\r
-void FDSGI(int h)\r
+void FDSGI(int h, void *param)\r
{\r
switch(h)\r
{\r
case GI_CLOSE: FDSClose();break;\r
case GI_POWER: FDSInit();break;\r
+ case GI_INFOSTRING: sprintf(param, "FDS, Sides: %d", TotalSides);break;\r
}\r
}\r
\r
FDSSoundReset();\r
InDisk=0;\r
SelectDisk=0;\r
+\r
+#ifdef ASM_6502\r
+ {\r
+ int page;\r
+ // asm code needs pages to be set again..\r
+ for (page=12; page<28; page++) // 0x6000-0xdfff 32K RAM\r
+ Page[page]=FDSRAM - (12<<11);\r
+ for (; page<32; page++) // 0xe000-0xffff 8K BIOS\r
+ Page[page]=FDSBIOS - (28<<11);\r
+ }\r
+#endif\r
}\r
\r
void FCEU_FDSInsert(void)\r
\r
static void FP_FASTAPASS(1) FDSFix(int a)\r
{\r
- if((IRQa&2) && IRQCount)\r
+ if(IRQCount && (IRQa&2))\r
{\r
IRQCount-=a;\r
if(IRQCount<=0)\r
uint8 ret=0;\r
\r
/* Cheap hack. */\r
+#ifndef ASM_6502\r
if(X.IRQlow&FCEU_IQEXT) ret|=1;\r
if(X.IRQlow&FCEU_IQEXT2) ret|=2;\r
+#else\r
+ if((nes_registers[4]>>8)&FCEU_IQEXT) ret|=1;\r
+ if((nes_registers[4]>>8)&FCEU_IQEXT2) ret|=2;\r
+#endif\r
\r
if(!fceuindbg)\r
{\r
clockcount=(clockcount+1)&7;\r
}\r
\r
-static INLINE int32 FDSDoSound(void)\r
+static INLINE int32 FDSDoSound(int32 mul)\r
{\r
fdso.count+=fdso.cycles;\r
if(fdso.count>=((int64)1<<40))\r
if(fdso.count>=32768) goto dogk;\r
\r
// Might need to emulate applying the amplitude to the waveform a bit better...\r
+/*\r
{\r
int k=amplitude[0];\r
if(k>0x20) k=0x20;\r
return (fdso.cwave[b24latch68>>19]*k)*4/((SPSG[0x9]&0x3)+2);\r
}\r
+*/\r
+ return (fdso.cwave[b24latch68>>19]*mul)>>16;\r
}\r
\r
static int32 FBC=0;\r
{\r
int32 end, start;\r
int32 x;\r
+ int32 mul;\r
\r
start=FBC;\r
end=(SOUNDTS<<16)/soundtsinc;\r
return;\r
FBC=end;\r
\r
+ // hack for performance, might produce bad results..\r
+ if (!amplitude[0])\r
+ return;\r
+\r
+ switch (SPSG[0x9]&0x3)\r
+ {\r
+ default:mul = (4<<16)/2;\r
+ case 1: mul = (4<<16)/3;\r
+ case 2: mul = (4<<16)/4;\r
+ case 3: mul = (4<<16)/5;\r
+ }\r
+ {\r
+ int k=amplitude[0];\r
+ if(k>0x20) k=0x20;\r
+ mul *= k;\r
+ }\r
+\r
if(!(SPSG[0x9]&0x80))\r
for(x=start;x<end;x++)\r
{\r
- uint32 t=FDSDoSound();\r
+ uint32 t=FDSDoSound(mul);\r
t+=t>>1;\r
t>>=4;\r
Wave[x>>4]+=t; //(t>>2)-(t>>3); //>>3;\r
FCEU_PrintError("FDS BIOS ROM image missing!");\r
FreeFDSMemory();\r
free(fn);\r
+ LoadGameLastError = 10;\r
return 0;\r
}\r
\r
fclose(zp);\r
FreeFDSMemory();\r
FCEU_PrintError("Error reading FDS BIOS ROM image.");\r
+ LoadGameLastError = 10;\r
return 0;\r
}\r
\r
{\r
FCEU_PrintError("Error reading auxillary FDS file.");\r
free(fn);\r
+ LoadGameLastError = 11;\r
return(0);\r
}\r
FCEU_fclose(tp);\r
{\r
FILE *fp;\r
int x;\r
- char *fn=FCEU_MakeFName(FCEUMKF_FDS,0,0);\r
-\r
- if(!DiskWritten) return;\r
+ char *fn;\r
\r
- if(!(fp=FCEUD_UTF8fopen(fn,"wb")))\r
+ if(!DiskWritten)\r
{\r
- free(fn);\r
- return;\r
- }\r
- free(fn);\r
+ fn=FCEU_MakeFName(FCEUMKF_FDS,0,0);\r
\r
- for(x=0;x<TotalSides;x++)\r
- {\r
- if(fwrite(diskdata[x],1,65500,fp)!=65500)\r
+ if(!(fp=FCEUD_UTF8fopen(fn,"wb")))\r
{\r
- FCEU_PrintError("Error saving FDS image!");\r
- fclose(fp);\r
+ free(fn);\r
return;\r
}\r
+ free(fn);\r
+\r
+ for(x=0;x<TotalSides;x++)\r
+ {\r
+ if(fwrite(diskdata[x],1,65500,fp)!=65500)\r
+ {\r
+ FCEU_PrintError("Error saving FDS image!");\r
+ fclose(fp);\r
+ return;\r
+ }\r
+ }\r
+ fclose(fp);\r
+#ifdef GP2X\r
+ sync();\r
+#endif\r
}\r
+\r
FreeFDSMemory();\r
- fclose(fp);\r
+ for(x=0;x<TotalSides;x++)\r
+ if(diskdatao[x])\r
+ {\r
+ free(diskdatao[x]);\r
+ diskdatao[x]=0;\r
+ }\r
+ ResetExState(0,0);\r
}\r
+\r