FDS corrections

This commit is contained in:
dborth 2009-07-20 07:14:18 +00:00
parent aec5667532
commit f2773a5b9c
2 changed files with 29 additions and 24 deletions

View File

@ -40,7 +40,7 @@
// and the when it can be successfully read/written to. This should // and the when it can be successfully read/written to. This should
// prevent writes to wrong places OR add code to prevent disk ejects // prevent writes to wrong places OR add code to prevent disk ejects
// when the virtual motor is on(mmm...virtual motor). // when the virtual motor is on(mmm...virtual motor).
extern int disableBatteryLoading; extern int disableBatteryLoading;
static DECLFR(FDSRead4030); static DECLFR(FDSRead4030);
static DECLFR(FDSRead4031); static DECLFR(FDSRead4031);
@ -94,7 +94,7 @@ void FDSGI(GI h)
} }
static void FDSStateRestore(int version) static void FDSStateRestore(int version)
{ {
int x; int x;
setmirror(((FDSRegs[5]&8)>>3)^1); setmirror(((FDSRegs[5]&8)>>3)^1);
@ -133,7 +133,7 @@ static void FDSInit(void)
SetReadHandler(0x4032,0x4032,FDSRead4032); SetReadHandler(0x4032,0x4032,FDSRead4032);
SetReadHandler(0x4033,0x4033,FDSRead4033); SetReadHandler(0x4033,0x4033,FDSRead4033);
SetWriteHandler(0x4020,0x4025,FDSWrite); SetWriteHandler(0x4020,0x4025,FDSWrite);
SetWriteHandler(0x6000,0xdfff,FDSRAMWrite); SetWriteHandler(0x6000,0xdfff,FDSRAMWrite);
SetReadHandler(0x6000,0xdfff,FDSRAMRead); SetReadHandler(0x6000,0xdfff,FDSRAMRead);
@ -149,15 +149,15 @@ void FCEU_FDSInsert(void)
{ {
if(TotalSides==0) if(TotalSides==0)
{ {
FCEU_DispMessage("Not FDS; can't eject disk."); FCEU_DispMessage("Not FDS; can't eject disk.");
return; return;
} }
if(InDisk==255) if(InDisk==255)
{ {
FCEU_DispMessage("Disk %d Side %s Inserted",SelectDisk>>1,(SelectDisk&1)?"B":"A"); FCEU_DispMessage("Disk %d Side %s Inserted",SelectDisk>>1,(SelectDisk&1)?"B":"A");
InDisk=SelectDisk; InDisk=SelectDisk;
} }
else else
{ {
FCEU_DispMessage("Disk %d Side %s Ejected",SelectDisk>>1,(SelectDisk&1)?"B":"A"); FCEU_DispMessage("Disk %d Side %s Ejected",SelectDisk>>1,(SelectDisk&1)?"B":"A");
InDisk=255; InDisk=255;
@ -198,14 +198,14 @@ static void FDSFix(int a)
IRQCount=IRQLatch=0; IRQCount=IRQLatch=0;
} }
else else
IRQCount=IRQLatch; IRQCount=IRQLatch;
//IRQCount=IRQLatch; //0xFFFF; //IRQCount=IRQLatch; //0xFFFF;
X6502_IRQBegin(FCEU_IQEXT); X6502_IRQBegin(FCEU_IQEXT);
//printf("IRQ: %d\n",timestamp); //printf("IRQ: %d\n",timestamp);
// printf("IRQ: %d\n",scanline); // printf("IRQ: %d\n",scanline);
} }
} }
if(DiskSeekIRQ>0) if(DiskSeekIRQ>0)
{ {
DiskSeekIRQ-=a; DiskSeekIRQ-=a;
if(DiskSeekIRQ<=0) if(DiskSeekIRQ<=0)
@ -250,14 +250,14 @@ static DECLFR(FDSRead4031)
return z; return z;
} }
static DECLFR(FDSRead4032) static DECLFR(FDSRead4032)
{ {
uint8 ret; uint8 ret;
ret=X.DB&~7; ret=X.DB&~7;
if(InDisk==255) if(InDisk==255)
ret|=5; ret|=5;
if(InDisk==255 || !(FDSRegs[5]&1) || (FDSRegs[5]&2)) if(InDisk==255 || !(FDSRegs[5]&1) || (FDSRegs[5]&2))
ret|=2; ret|=2;
return ret; return ret;
} }
@ -356,7 +356,7 @@ static DECLFW(FDSSWrite)
A-=0x4080; A-=0x4080;
switch(A) switch(A)
{ {
case 0x0: case 0x0:
case 0x4: if(V&0x80) case 0x4: if(V&0x80)
amplitude[(A&0xF)>>2]=V&0x3F; //)>0x20?0x20:(V&0x3F); amplitude[(A&0xF)>>2]=V&0x3F; //)>0x20?0x20:(V&0x3F);
break; break;
@ -372,7 +372,7 @@ static DECLFW(FDSSWrite)
break; break;
} }
//if(A>=0x7 && A!=0x8 && A<=0xF) //if(A>=0x7 && A!=0x8 && A<=0xF)
//if(A==0xA || A==0x9) //if(A==0xA || A==0x9)
//printf("$%04x:$%02x\n",A,V); //printf("$%04x:$%02x\n",A,V);
SPSG[A]=V; SPSG[A]=V;
} }
@ -439,7 +439,7 @@ static INLINE void ClockRise(void)
b19shiftreg60=(SPSG[0x2]|((SPSG[0x3]&0xF)<<8)); b19shiftreg60=(SPSG[0x2]|((SPSG[0x3]&0xF)<<8));
b17latch76=(SPSG[0x6]|((SPSG[0x07]&0xF)<<8))+b17latch76; b17latch76=(SPSG[0x6]|((SPSG[0x07]&0xF)<<8))+b17latch76;
if(!(SPSG[0x7]&0x80)) if(!(SPSG[0x7]&0x80))
{ {
int t=fdso.mwave[(b17latch76>>13)&0x1F]&7; int t=fdso.mwave[(b17latch76>>13)&0x1F]&7;
int t2=amplitude[1]; int t2=amplitude[1];
@ -459,13 +459,13 @@ static INLINE void ClockRise(void)
b8shiftreg88=0x80 + adj; b8shiftreg88=0x80 + adj;
} }
else else
{ {
b8shiftreg88=0x80; b8shiftreg88=0x80;
} }
} }
else else
{ {
b19shiftreg60<<=1; b19shiftreg60<<=1;
b8shiftreg88>>=1; b8shiftreg88>>=1;
} }
// b24adder66=(b24latch68+b19shiftreg60)&0x3FFFFFF; // b24adder66=(b24latch68+b19shiftreg60)&0x3FFFFFF;
@ -495,7 +495,7 @@ dogk:
if(fdso.envcount<=0) if(fdso.envcount<=0)
{ {
fdso.envcount+=SPSG[0xA]*3; fdso.envcount+=SPSG[0xA]*3;
DoEnv(); DoEnv();
} }
} }
if(fdso.count>=32768) goto dogk; if(fdso.count>=32768) goto dogk;
@ -702,7 +702,7 @@ static int SubLoad(FCEUFILE *fp)
} }
else else
return(0); return(0);
} }
else else
TotalSides=header[4]; TotalSides=header[4];
@ -752,7 +752,7 @@ static void PostSave(void)
for(b=0; b<65500; b++) for(b=0; b<65500; b++)
diskdata[x][b] ^= diskdatao[x][b]; diskdata[x][b] ^= diskdatao[x][b];
} }
} }
@ -764,13 +764,13 @@ int FDSLoad(const char *name, FCEUFILE *fp)
FCEU_fseek(fp,0,SEEK_SET); FCEU_fseek(fp,0,SEEK_SET);
if(!SubLoad(fp)) if(!SubLoad(fp))
return(0); return(0);
#ifndef GEKKO #ifndef GEKKO
fn = strdup(FCEU_MakeFName(FCEUMKF_FDSROM,0,0).c_str()); fn = strdup(FCEU_MakeFName(FCEUMKF_FDSROM,0,0).c_str());
if(!(zp=FCEUD_UTF8fopen(fn,"rb"))) if(!(zp=FCEUD_UTF8fopen(fn,"rb")))
{ {
FCEU_PrintError("FDS BIOS ROM image missing!"); FCEU_PrintError("FDS BIOS ROM image missing!");
FreeFDSMemory(); FreeFDSMemory();
@ -802,7 +802,7 @@ if (!disableBatteryLoading)
diskdatao[x]=(uint8 *)FCEU_malloc(65500); diskdatao[x]=(uint8 *)FCEU_malloc(65500);
memcpy(diskdatao[x],diskdata[x],65500); memcpy(diskdatao[x],diskdata[x],65500);
} }
#ifndef GEKKO
if((tp=FCEU_fopen(fn,0,"rb",0))) if((tp=FCEU_fopen(fn,0,"rb",0)))
{ {
FreeFDSMemory(); FreeFDSMemory();
@ -816,6 +816,7 @@ if (!disableBatteryLoading)
DiskWritten=1; /* For save state handling. */ DiskWritten=1; /* For save state handling. */
} }
free(fn); free(fn);
#endif
} }
GameInfo->type=GIT_FDS; GameInfo->type=GIT_FDS;
@ -829,7 +830,7 @@ if (!disableBatteryLoading)
for(x=0;x<TotalSides;x++) for(x=0;x<TotalSides;x++)
{ {
char temp[5]; char temp[5];
sprintf(temp,"DDT%d",x); sprintf(temp,"DDT%d",x);
AddExState(diskdata[x],65500,0,temp); AddExState(diskdata[x],65500,0,temp);
} }
@ -862,6 +863,10 @@ if (!disableBatteryLoading)
void FDSClose(void) void FDSClose(void)
{ {
#ifdef GEKKO
FreeFDSMemory();
return;
#endif
FILE *fp; FILE *fp;
int x; int x;
char *fn=strdup(FCEU_MakeFName(FCEUMKF_FDS,0,0).c_str()); char *fn=strdup(FCEU_MakeFName(FCEUMKF_FDS,0,0).c_str());
@ -877,7 +882,7 @@ void FDSClose(void)
for(x=0;x<TotalSides;x++) for(x=0;x<TotalSides;x++)
{ {
if(fwrite(diskdata[x],1,65500,fp)!=65500) if(fwrite(diskdata[x],1,65500,fp)!=65500)
{ {
FCEU_PrintError("Error saving FDS image!"); FCEU_PrintError("Error saving FDS image!");
fclose(fp); fclose(fp);

View File

@ -283,7 +283,7 @@ copy_to_xfb (u32 arg)
switch(FDSSwitchRequested) switch(FDSSwitchRequested)
{ {
case 1: case 1:
// FCEUI_FDSEject(); // eject disk FCEUI_FDSInsert(); // eject disk
FDSSwitchRequested++; FDSSwitchRequested++;
break; break;
case 2: case 2: