Fix: Nick's disappearing disk bug

Fix: Cmd-line switches for inserting disks
This commit is contained in:
tomch 2009-05-29 21:39:13 +00:00
parent 51cb37a850
commit 41b90361fd
6 changed files with 27 additions and 13 deletions

View File

@ -874,6 +874,7 @@ int APIENTRY WinMain (HINSTANCE passinstance, HINSTANCE, LPSTR lpCmdLine, int)
// //
// Make APPLEWIN process higher priority // Make APPLEWIN process higher priority
// . BUG: No disk in Drive-1, and boot Apple: Windows will start to crawl!
if ( SetPriorityClass(GetCurrentProcess(), ABOVE_NORMAL_PRIORITY_CLASS) ) if ( SetPriorityClass(GetCurrentProcess(), ABOVE_NORMAL_PRIORITY_CLASS) )
{ {
// Make main thread (for audio) higher priority // Make main thread (for audio) higher priority

View File

@ -118,7 +118,7 @@ enum eSOUNDCARDTYPE {SC_UNINIT=0, SC_NONE, SC_MOCKINGBOARD, SC_PHASOR}; // Apple
typedef BYTE (__stdcall *iofunction)(WORD nPC, WORD nAddr, BYTE nWriteFlag, BYTE nWriteValue, ULONG nCyclesLeft); typedef BYTE (__stdcall *iofunction)(WORD nPC, WORD nAddr, BYTE nWriteFlag, BYTE nWriteValue, ULONG nCyclesLeft);
typedef struct _IMAGE__ { int unused; } *HIMAGE; typedef struct _IMAGE__ { int unused; } *HIMAGE; // DiskImage's /imageinforec/ is hidden behind HIMAGE
enum eIRQSRC {IS_6522=0, IS_SPEECH, IS_SSC, IS_MOUSE}; enum eIRQSRC {IS_6522=0, IS_SPEECH, IS_SSC, IS_MOUSE};

View File

@ -59,7 +59,6 @@ static BYTE __stdcall DiskSetWriteMode (WORD pc, WORD addr, BYTE bWrite, BYTE d,
BOOL enhancedisk = 1; BOOL enhancedisk = 1;
string DiskPathFilename[]; // dynamic array of strings string DiskPathFilename[]; // dynamic array of strings
UINT g_uNumTracksInImage = 0;
// Private ________________________________________________________________________________________ // Private ________________________________________________________________________________________
@ -110,11 +109,11 @@ void Disk_LoadLastDiskImage( int iDrive )
char *pRegKey = (!iDrive) char *pRegKey = (!iDrive)
? REGVALUE_PREF_LAST_DISK_1 ? REGVALUE_PREF_LAST_DISK_1
: REGVALUE_PREF_LAST_DISK_2; : REGVALUE_PREF_LAST_DISK_2;
if( RegLoadString(TEXT(REG_PREFS),pRegKey,1,sFilePath,MAX_PATH) ) if( RegLoadString(TEXT(REG_PREFS),pRegKey,1,sFilePath,MAX_PATH) )
{ {
sFilePath[ MAX_PATH ] = 0; sFilePath[ MAX_PATH ] = 0;
DiskPathFilename[ iDrive ] = sFilePath; DiskPathFilename[ iDrive ] = sFilePath;
const char *pFileName = DiskPathFilename[iDrive].c_str();
#if _DEBUG #if _DEBUG
// MessageBox(NULL,pFileName,pRegKey,MB_OK); // MessageBox(NULL,pFileName,pRegKey,MB_OK);
@ -122,7 +121,8 @@ void Disk_LoadLastDiskImage( int iDrive )
// _tcscat(imagefilename,TEXT("MASTER.DSK")); // TODO: Should remember last disk by user // _tcscat(imagefilename,TEXT("MASTER.DSK")); // TODO: Should remember last disk by user
bSaveDiskImage = false; bSaveDiskImage = false;
DiskInsert(iDrive,pFileName,0,0); // Pass in ptr to local copy of filepath, since RemoveDisk() sets DiskPathFilename = ""
DiskInsert(iDrive,sFilePath,0,0);
bSaveDiskImage = true; bSaveDiskImage = true;
} }
//else MessageBox(NULL,"Reg Key/Value not found",pRegKey,MB_OK); //else MessageBox(NULL,"Reg Key/Value not found",pRegKey,MB_OK);
@ -249,7 +249,7 @@ static void ReadTrack (int iDrive)
Disk_t *pFloppy = &g_aFloppyDisk[ iDrive ]; Disk_t *pFloppy = &g_aFloppyDisk[ iDrive ];
if (pFloppy->track >= (int)g_uNumTracksInImage) if (pFloppy->track >= ImageGetNumTracks(pFloppy->imagehandle))
{ {
pFloppy->trackimagedata = 0; pFloppy->trackimagedata = 0;
return; return;
@ -308,7 +308,7 @@ static void WriteTrack (int iDrive)
{ {
Disk_t *pFloppy = &g_aFloppyDisk[ iDrive ]; Disk_t *pFloppy = &g_aFloppyDisk[ iDrive ];
if (pFloppy->track >= (int)g_uNumTracksInImage) if (pFloppy->track >= ImageGetNumTracks(pFloppy->imagehandle))
return; return;
if (pFloppy->writeprotected) if (pFloppy->writeprotected)
@ -382,7 +382,8 @@ static BYTE __stdcall DiskControlStepper (WORD, WORD address, BYTE, BYTE, ULONG)
if (direction) if (direction)
{ {
fptr->phase = MAX(0, MIN(79, fptr->phase + direction)); fptr->phase = MAX(0, MIN(79, fptr->phase + direction));
int newtrack = MIN((int)g_uNumTracksInImage-1, fptr->phase >> 1); // (round half tracks down) const int nNumTracksInImage = ImageGetNumTracks(fptr->imagehandle);
int newtrack = MIN(nNumTracksInImage-1, fptr->phase >> 1); // (round half tracks down)
LOG_DISK("newtrack %2X%s\r", newtrack, (fptr->phase & 1) ? ".5" : ""); LOG_DISK("newtrack %2X%s\r", newtrack, (fptr->phase & 1) ? ".5" : "");
if (newtrack != fptr->track) if (newtrack != fptr->track)
{ {

View File

@ -9,8 +9,7 @@
#define TRACKS_MAX (TRACKS_STANDARD+TRACKS_EXTRA) #define TRACKS_MAX (TRACKS_STANDARD+TRACKS_EXTRA)
extern BOOL enhancedisk; extern BOOL enhancedisk;
extern string DiskPathFilename[2]; extern string DiskPathFilename[DRIVES];
extern UINT g_uNumTracksInImage;
void DiskInitialize (); // DiskManagerStartup() void DiskInitialize (); // DiskManagerStartup()
void DiskDestroy (); // no, doesn't "destroy" the disk image. DiskManagerShutdown() void DiskDestroy (); // no, doesn't "destroy" the disk image. DiskManagerShutdown()

View File

@ -45,8 +45,11 @@ typedef struct _imageinforec {
DWORD headersize; DWORD headersize;
LPBYTE header; LPBYTE header;
BOOL validtrack[TRACKS_MAX]; BOOL validtrack[TRACKS_MAX];
UINT uNumTracks;
} imageinforec, *imageinfoptr; } imageinforec, *imageinfoptr;
static UINT g_uNumTracksInImage = 0; // Init'd by ImageOpen() & possibly updated by IsValidImageSize()
typedef BOOL (*boottype )(imageinfoptr); typedef BOOL (*boottype )(imageinfoptr);
typedef DWORD (*detecttype)(LPBYTE,DWORD); typedef DWORD (*detecttype)(LPBYTE,DWORD);
typedef void (*readtype )(imageinfoptr,int,int,LPBYTE,int *); typedef void (*readtype )(imageinfoptr,int,int,LPBYTE,int *);
@ -745,7 +748,7 @@ void ImageClose (HIMAGE imagehandle){
imageinfoptr ptr = (imageinfoptr)imagehandle; imageinfoptr ptr = (imageinfoptr)imagehandle;
if (ptr->file != INVALID_HANDLE_VALUE) if (ptr->file != INVALID_HANDLE_VALUE)
CloseHandle(ptr->file); CloseHandle(ptr->file);
for (UINT track = 0; track < g_uNumTracksInImage; track++) for (UINT track = 0; track < ptr->uNumTracks; track++)
if (!ptr->validtrack[track]) { if (!ptr->validtrack[track]) {
DeleteFile(ptr->filename); DeleteFile(ptr->filename);
break; break;
@ -833,7 +836,8 @@ int ImageOpen (LPCTSTR imagefilename,
const DWORD UNKNOWN_FORMAT = 0xFFFFFFFF; const DWORD UNKNOWN_FORMAT = 0xFFFFFFFF;
DWORD format = UNKNOWN_FORMAT; DWORD format = UNKNOWN_FORMAT;
g_uNumTracksInImage = (size > 0) ? TRACKS_STANDARD : 0; // Assume default # tracks
if (size > 0) if (size > 0)
{ {
// MAP THE FILE INTO MEMORY FOR USE BY THE DETECTION FUNCTIONS // MAP THE FILE INTO MEMORY FOR USE BY THE DETECTION FUNCTIONS
@ -914,6 +918,7 @@ int ImageOpen (LPCTSTR imagefilename,
((imageinfoptr)*hDiskImage_)->file = file; ((imageinfoptr)*hDiskImage_)->file = file;
((imageinfoptr)*hDiskImage_)->offset = pImage-view; ((imageinfoptr)*hDiskImage_)->offset = pImage-view;
((imageinfoptr)*hDiskImage_)->writeprotected = *pWriteProtected_; ((imageinfoptr)*hDiskImage_)->writeprotected = *pWriteProtected_;
((imageinfoptr)*hDiskImage_)->uNumTracks = g_uNumTracksInImage;
for (UINT track = 0; track < g_uNumTracksInImage; track++) for (UINT track = 0; track < g_uNumTracksInImage; track++)
((imageinfoptr)*hDiskImage_)->validtrack[track] = (size > 0); ((imageinfoptr)*hDiskImage_)->validtrack[track] = (size > 0);
@ -955,4 +960,11 @@ void ImageWriteTrack (HIMAGE imagehandle,
ptr->validtrack[track] = 1; ptr->validtrack[track] = 1;
} }
} }
//===========================================================================
int ImageGetNumTracks(HIMAGE imagehandle)
{
imageinfoptr ptr = (imageinfoptr)imagehandle;
return ptr ? ptr->uNumTracks : 0;
}

View File

@ -17,8 +17,9 @@ enum ImageError_e
IMAGE_ERROR_BAD_SIZE = 2 IMAGE_ERROR_BAD_SIZE = 2
}; };
//int ImageOpen (LPCTSTR,HIMAGE *,BOOL *,BOOL);
int ImageOpen (LPCTSTR imagefilename, HIMAGE *hDiskImage_, BOOL *pWriteProtected_, BOOL bCreateIfNecessary ); int ImageOpen (LPCTSTR imagefilename, HIMAGE *hDiskImage_, BOOL *pWriteProtected_, BOOL bCreateIfNecessary );
void ImageReadTrack (HIMAGE,int,int,LPBYTE,int *); void ImageReadTrack (HIMAGE,int,int,LPBYTE,int *);
void ImageWriteTrack (HIMAGE,int,int,LPBYTE,int); void ImageWriteTrack (HIMAGE,int,int,LPBYTE,int);
int ImageGetNumTracks(HIMAGE imagehandle);