From 41b90361fdf35a0a27144c4295beb9713e0bd5da Mon Sep 17 00:00:00 2001 From: tomch Date: Fri, 29 May 2009 21:39:13 +0000 Subject: [PATCH] Fix: Nick's disappearing disk bug Fix: Cmd-line switches for inserting disks --- AppleWin/source/Applewin.cpp | 1 + AppleWin/source/Common.h | 2 +- AppleWin/source/Disk.cpp | 13 +++++++------ AppleWin/source/Disk.h | 3 +-- AppleWin/source/DiskImage.cpp | 18 +++++++++++++++--- AppleWin/source/DiskImage.h | 3 ++- 6 files changed, 27 insertions(+), 13 deletions(-) diff --git a/AppleWin/source/Applewin.cpp b/AppleWin/source/Applewin.cpp index ad668b38..7e9bb5e3 100644 --- a/AppleWin/source/Applewin.cpp +++ b/AppleWin/source/Applewin.cpp @@ -874,6 +874,7 @@ int APIENTRY WinMain (HINSTANCE passinstance, HINSTANCE, LPSTR lpCmdLine, int) // // 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) ) { // Make main thread (for audio) higher priority diff --git a/AppleWin/source/Common.h b/AppleWin/source/Common.h index 309bf32d..26fefc9c 100644 --- a/AppleWin/source/Common.h +++ b/AppleWin/source/Common.h @@ -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 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}; diff --git a/AppleWin/source/Disk.cpp b/AppleWin/source/Disk.cpp index 2427ee14..59b38162 100644 --- a/AppleWin/source/Disk.cpp +++ b/AppleWin/source/Disk.cpp @@ -59,7 +59,6 @@ static BYTE __stdcall DiskSetWriteMode (WORD pc, WORD addr, BYTE bWrite, BYTE d, BOOL enhancedisk = 1; string DiskPathFilename[]; // dynamic array of strings - UINT g_uNumTracksInImage = 0; // Private ________________________________________________________________________________________ @@ -110,11 +109,11 @@ void Disk_LoadLastDiskImage( int iDrive ) char *pRegKey = (!iDrive) ? REGVALUE_PREF_LAST_DISK_1 : REGVALUE_PREF_LAST_DISK_2; + if( RegLoadString(TEXT(REG_PREFS),pRegKey,1,sFilePath,MAX_PATH) ) { sFilePath[ MAX_PATH ] = 0; DiskPathFilename[ iDrive ] = sFilePath; - const char *pFileName = DiskPathFilename[iDrive].c_str(); #if _DEBUG // 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 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; } //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 ]; - if (pFloppy->track >= (int)g_uNumTracksInImage) + if (pFloppy->track >= ImageGetNumTracks(pFloppy->imagehandle)) { pFloppy->trackimagedata = 0; return; @@ -308,7 +308,7 @@ static void WriteTrack (int iDrive) { Disk_t *pFloppy = &g_aFloppyDisk[ iDrive ]; - if (pFloppy->track >= (int)g_uNumTracksInImage) + if (pFloppy->track >= ImageGetNumTracks(pFloppy->imagehandle)) return; if (pFloppy->writeprotected) @@ -382,7 +382,8 @@ static BYTE __stdcall DiskControlStepper (WORD, WORD address, BYTE, BYTE, ULONG) if (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" : ""); if (newtrack != fptr->track) { diff --git a/AppleWin/source/Disk.h b/AppleWin/source/Disk.h index 0b6a6b0b..0fb8eea3 100644 --- a/AppleWin/source/Disk.h +++ b/AppleWin/source/Disk.h @@ -9,8 +9,7 @@ #define TRACKS_MAX (TRACKS_STANDARD+TRACKS_EXTRA) extern BOOL enhancedisk; -extern string DiskPathFilename[2]; -extern UINT g_uNumTracksInImage; +extern string DiskPathFilename[DRIVES]; void DiskInitialize (); // DiskManagerStartup() void DiskDestroy (); // no, doesn't "destroy" the disk image. DiskManagerShutdown() diff --git a/AppleWin/source/DiskImage.cpp b/AppleWin/source/DiskImage.cpp index 6478b0d2..5eb9fa15 100644 --- a/AppleWin/source/DiskImage.cpp +++ b/AppleWin/source/DiskImage.cpp @@ -45,8 +45,11 @@ typedef struct _imageinforec { DWORD headersize; LPBYTE header; BOOL validtrack[TRACKS_MAX]; + UINT uNumTracks; } imageinforec, *imageinfoptr; +static UINT g_uNumTracksInImage = 0; // Init'd by ImageOpen() & possibly updated by IsValidImageSize() + typedef BOOL (*boottype )(imageinfoptr); typedef DWORD (*detecttype)(LPBYTE,DWORD); typedef void (*readtype )(imageinfoptr,int,int,LPBYTE,int *); @@ -745,7 +748,7 @@ void ImageClose (HIMAGE imagehandle){ imageinfoptr ptr = (imageinfoptr)imagehandle; if (ptr->file != INVALID_HANDLE_VALUE) CloseHandle(ptr->file); - for (UINT track = 0; track < g_uNumTracksInImage; track++) + for (UINT track = 0; track < ptr->uNumTracks; track++) if (!ptr->validtrack[track]) { DeleteFile(ptr->filename); break; @@ -833,7 +836,8 @@ int ImageOpen (LPCTSTR imagefilename, const DWORD UNKNOWN_FORMAT = 0xFFFFFFFF; DWORD format = UNKNOWN_FORMAT; - + g_uNumTracksInImage = (size > 0) ? TRACKS_STANDARD : 0; // Assume default # tracks + if (size > 0) { // 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_)->offset = pImage-view; ((imageinfoptr)*hDiskImage_)->writeprotected = *pWriteProtected_; + ((imageinfoptr)*hDiskImage_)->uNumTracks = g_uNumTracksInImage; for (UINT track = 0; track < g_uNumTracksInImage; track++) ((imageinfoptr)*hDiskImage_)->validtrack[track] = (size > 0); @@ -955,4 +960,11 @@ void ImageWriteTrack (HIMAGE imagehandle, ptr->validtrack[track] = 1; } } - \ No newline at end of file + +//=========================================================================== + +int ImageGetNumTracks(HIMAGE imagehandle) +{ + imageinfoptr ptr = (imageinfoptr)imagehandle; + return ptr ? ptr->uNumTracks : 0; +} diff --git a/AppleWin/source/DiskImage.h b/AppleWin/source/DiskImage.h index a35adc8a..a305b77a 100644 --- a/AppleWin/source/DiskImage.h +++ b/AppleWin/source/DiskImage.h @@ -17,8 +17,9 @@ enum ImageError_e IMAGE_ERROR_BAD_SIZE = 2 }; -//int ImageOpen (LPCTSTR,HIMAGE *,BOOL *,BOOL); int ImageOpen (LPCTSTR imagefilename, HIMAGE *hDiskImage_, BOOL *pWriteProtected_, BOOL bCreateIfNecessary ); void ImageReadTrack (HIMAGE,int,int,LPBYTE,int *); void ImageWriteTrack (HIMAGE,int,int,LPBYTE,int); + +int ImageGetNumTracks(HIMAGE imagehandle);