New disks can now be a G64 or a D64
This commit is contained in:
parent
bf6d61d27b
commit
64291c0dfd
6 changed files with 120 additions and 54 deletions
|
@ -208,13 +208,13 @@ bool DiskImage::OpenD64(const FILINFO* fileInfo, unsigned char* diskImage, unsig
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DiskImage::WriteD64()
|
bool DiskImage::WriteD64(char* name)
|
||||||
{
|
{
|
||||||
if (readOnly)
|
if (readOnly)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
FIL fp;
|
FIL fp;
|
||||||
FRESULT res = f_open(&fp, fileInfo->fname, FA_CREATE_ALWAYS | FA_WRITE);
|
FRESULT res = f_open(&fp, fileInfo ? fileInfo->fname : name, FA_CREATE_ALWAYS | FA_WRITE);
|
||||||
if (res == FR_OK)
|
if (res == FR_OK)
|
||||||
{
|
{
|
||||||
u32 bytesToWrite;
|
u32 bytesToWrite;
|
||||||
|
@ -790,13 +790,13 @@ static bool WriteDwords(FIL* fp, u32* values, u32 amount)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DiskImage::WriteG64()
|
bool DiskImage::WriteG64(char* name)
|
||||||
{
|
{
|
||||||
if (readOnly)
|
if (readOnly)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
FIL fp;
|
FIL fp;
|
||||||
FRESULT res = f_open(&fp, fileInfo->fname, FA_CREATE_ALWAYS | FA_WRITE);
|
FRESULT res = f_open(&fp, fileInfo ? fileInfo->fname : name, FA_CREATE_ALWAYS | FA_WRITE);
|
||||||
if (res == FR_OK)
|
if (res == FR_OK)
|
||||||
{
|
{
|
||||||
u32 bytesToWrite;
|
u32 bytesToWrite;
|
||||||
|
|
|
@ -164,6 +164,9 @@ public:
|
||||||
unsigned char tracksD81[HALF_TRACK_COUNT][2][MAX_TRACK_LENGTH];
|
unsigned char tracksD81[HALF_TRACK_COUNT][2][MAX_TRACK_LENGTH];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bool WriteD64(char* name = 0);
|
||||||
|
bool WriteG64(char* name = 0);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void CloseD64();
|
void CloseD64();
|
||||||
void CloseG64();
|
void CloseG64();
|
||||||
|
@ -172,8 +175,6 @@ private:
|
||||||
void CloseD71();
|
void CloseD71();
|
||||||
void CloseD81();
|
void CloseD81();
|
||||||
|
|
||||||
bool WriteD64();
|
|
||||||
bool WriteG64();
|
|
||||||
bool WriteNIB();
|
bool WriteNIB();
|
||||||
bool WriteNBZ();
|
bool WriteNBZ();
|
||||||
bool WriteD71();
|
bool WriteD71();
|
||||||
|
|
|
@ -1175,7 +1175,7 @@ void FileBrowser::UpdateInputFolders()
|
||||||
char newFileName[64];
|
char newFileName[64];
|
||||||
strncpy (newFileName, options.GetAutoBaseName(), 63);
|
strncpy (newFileName, options.GetAutoBaseName(), 63);
|
||||||
int num = folder.FindNextAutoName( newFileName );
|
int num = folder.FindNextAutoName( newFileName );
|
||||||
m_IEC_Commands.CreateD64(newFileName, "42", true);
|
m_IEC_Commands.CreateNewDisk(newFileName, "42", true);
|
||||||
FolderChanged();
|
FolderChanged();
|
||||||
}
|
}
|
||||||
else if (inputMappings->BrowseWriteProtect())
|
else if (inputMappings->BrowseWriteProtect())
|
||||||
|
@ -1420,7 +1420,7 @@ void FileBrowser::DisplayDiskInfo(DiskImage* diskImage, const char* filenameForI
|
||||||
char name[17] = { 0 };
|
char name[17] = { 0 };
|
||||||
unsigned char buffer[260] = { 0 };
|
unsigned char buffer[260] = { 0 };
|
||||||
int charIndex;
|
int charIndex;
|
||||||
u32 fontHeight = screenMain->GetFontHeight();
|
u32 fontHeight = screenMain->GetFontHeightDirectoryDisplay();
|
||||||
u32 x = 0;
|
u32 x = 0;
|
||||||
u32 y = 0;
|
u32 y = 0;
|
||||||
char bufferOut[128] = { 0 };
|
char bufferOut[128] = { 0 };
|
||||||
|
|
|
@ -51,6 +51,7 @@ extern void Reboot_Pi();
|
||||||
|
|
||||||
extern void SwitchDrive(const char* drive);
|
extern void SwitchDrive(const char* drive);
|
||||||
extern int numberOfUSBMassStorageDevices;
|
extern int numberOfUSBMassStorageDevices;
|
||||||
|
extern void DisplayMessage(int x, int y, bool LCD, const char* message, u32 textColour, u32 backgroundColour);
|
||||||
|
|
||||||
#define WaitWhile(checkStatus) \
|
#define WaitWhile(checkStatus) \
|
||||||
do\
|
do\
|
||||||
|
@ -244,6 +245,7 @@ IEC_Commands::IEC_Commands()
|
||||||
C128BootSectorName = 0;
|
C128BootSectorName = 0;
|
||||||
displayingDevices = false;
|
displayingDevices = false;
|
||||||
lowercaseBrowseModeFilenames = false;
|
lowercaseBrowseModeFilenames = false;
|
||||||
|
newDiskType = DiskImage::D64;
|
||||||
}
|
}
|
||||||
|
|
||||||
void IEC_Commands::Reset(void)
|
void IEC_Commands::Reset(void)
|
||||||
|
@ -1171,7 +1173,7 @@ void IEC_Commands::New(void)
|
||||||
{
|
{
|
||||||
FILINFO filInfo;
|
FILINFO filInfo;
|
||||||
|
|
||||||
int ret = CreateD64(filenameNew, ID, true);
|
int ret = CreateNewDisk(filenameNew, ID, true);
|
||||||
|
|
||||||
if (ret==0)
|
if (ret==0)
|
||||||
updateAction = REFRESH;
|
updateAction = REFRESH;
|
||||||
|
@ -2051,27 +2053,37 @@ void IEC_Commands::CloseFile(u8 secondary)
|
||||||
channel.Close();
|
channel.Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
int IEC_Commands::CreateD64(char* filenameNew, char* ID, bool automount)
|
int IEC_Commands::CreateNewDisk(char* filenameNew, char* ID, bool automount)
|
||||||
{
|
{
|
||||||
FILINFO filInfo;
|
FILINFO filInfo;
|
||||||
FRESULT res;
|
FRESULT res;
|
||||||
char* ptr;
|
char* ptr;
|
||||||
int i;
|
int i;
|
||||||
//bool g64 = false;
|
|
||||||
|
|
||||||
//if (strstr(filenameNew, ".g64") || strstr(filenameNew, ".G64"))
|
DisplayMessage(240, 280, false, "Creating new disk", RGBA(0xff, 0xff, 0xff, 0xff), RGBA(0xff, 0, 0, 0xff));
|
||||||
// g64 = true;
|
DisplayMessage(0, 0, true, "Creating new disk", RGBA(0xff, 0xff, 0xff, 0xff), RGBA(0xff, 0, 0, 0xff));
|
||||||
//else
|
|
||||||
|
switch (newDiskType)
|
||||||
|
{
|
||||||
|
case DiskImage::D64:
|
||||||
if (!(strstr(filenameNew, ".d64") || strstr(filenameNew, ".D64")))
|
if (!(strstr(filenameNew, ".d64") || strstr(filenameNew, ".D64")))
|
||||||
strcat(filenameNew, ".d64");
|
strcat(filenameNew, ".d64");
|
||||||
|
break;
|
||||||
|
case DiskImage::G64:
|
||||||
|
if (!(strstr(filenameNew, ".g64") || strstr(filenameNew, ".G64")))
|
||||||
|
strcat(filenameNew, ".g64");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return ERROR_25_WRITE_ERROR;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
res = f_stat(filenameNew, &filInfo);
|
res = f_stat(filenameNew, &filInfo);
|
||||||
if (res == FR_NO_FILE)
|
if (res == FR_NO_FILE)
|
||||||
{
|
{
|
||||||
FIL fpOut;
|
|
||||||
res = f_open(&fpOut, filenameNew, FA_CREATE_ALWAYS | FA_WRITE);
|
unsigned char* dest = DiskImage::readBuffer;
|
||||||
if (res == FR_OK)
|
|
||||||
{
|
|
||||||
char buffer[256];
|
char buffer[256];
|
||||||
u32 bytes;
|
u32 bytes;
|
||||||
u32 blocks;
|
u32 blocks;
|
||||||
|
@ -2080,8 +2092,10 @@ int IEC_Commands::CreateD64(char* filenameNew, char* ID, bool automount)
|
||||||
// TODO: Should check for disk full.
|
// TODO: Should check for disk full.
|
||||||
for (blocks = 0; blocks < 357; ++blocks)
|
for (blocks = 0; blocks < 357; ++blocks)
|
||||||
{
|
{
|
||||||
if (f_write(&fpOut, buffer, 256, &bytes) != FR_OK)
|
for (i = 0; i < 256; ++i)
|
||||||
break;
|
{
|
||||||
|
*dest++ = buffer[i];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ptr = (char*)&blankD64DIRBAM[DISKNAME_OFFSET_IN_DIR_BLOCK];
|
ptr = (char*)&blankD64DIRBAM[DISKNAME_OFFSET_IN_DIR_BLOCK];
|
||||||
int len = strlen(filenameNew);
|
int len = strlen(filenameNew);
|
||||||
|
@ -2097,17 +2111,46 @@ int IEC_Commands::CreateD64(char* filenameNew, char* ID, bool automount)
|
||||||
{
|
{
|
||||||
*ptr++ = ascii2petscii(ID[i]);
|
*ptr++ = ascii2petscii(ID[i]);
|
||||||
}
|
}
|
||||||
f_write(&fpOut, blankD64DIRBAM, 256, &bytes);
|
//f_write(&fpOut, blankD64DIRBAM, 256, &bytes);
|
||||||
|
for (i = 0; i < 256; ++i)
|
||||||
|
{
|
||||||
|
*dest++ = blankD64DIRBAM[i];
|
||||||
|
}
|
||||||
buffer[1] = 0xff;
|
buffer[1] = 0xff;
|
||||||
f_write(&fpOut, buffer, 256, &bytes);
|
//f_write(&fpOut, buffer, 256, &bytes);
|
||||||
|
for (i = 0; i < 256; ++i)
|
||||||
|
{
|
||||||
|
*dest++ = buffer[i];
|
||||||
|
}
|
||||||
buffer[1] = 0;
|
buffer[1] = 0;
|
||||||
for (blocks = 0; blocks < 324; ++blocks)
|
for (blocks = 0; blocks < 324; ++blocks)
|
||||||
{
|
{
|
||||||
if (f_write(&fpOut, buffer, 256, &bytes) != FR_OK)
|
//if (f_write(&fpOut, buffer, 256, &bytes) != FR_OK)
|
||||||
|
// break;
|
||||||
|
for (i = 0; i < 256; ++i)
|
||||||
|
{
|
||||||
|
*dest++ = buffer[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DiskImage diskImage;
|
||||||
|
diskImage.OpenD64((const FILINFO*)0, (unsigned char*)DiskImage::readBuffer, dest - (unsigned char*)DiskImage::readBuffer);
|
||||||
|
|
||||||
|
switch (newDiskType)
|
||||||
|
{
|
||||||
|
case DiskImage::D64:
|
||||||
|
if (!diskImage.WriteD64(filenameNew))
|
||||||
|
return ERROR_25_WRITE_ERROR;
|
||||||
|
break;
|
||||||
|
case DiskImage::G64:
|
||||||
|
if (!diskImage.WriteG64(filenameNew))
|
||||||
|
return ERROR_25_WRITE_ERROR;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return ERROR_25_WRITE_ERROR;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
f_close(&fpOut);
|
|
||||||
}
|
|
||||||
// Mount the new disk? Shoud we do this or let them do it manually?
|
// Mount the new disk? Shoud we do this or let them do it manually?
|
||||||
if (automount && f_stat(filenameNew, &filInfo) == FR_OK)
|
if (automount && f_stat(filenameNew, &filInfo) == FR_OK)
|
||||||
{
|
{
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include "iec_bus.h"
|
#include "iec_bus.h"
|
||||||
#include "ff.h"
|
#include "ff.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
#include "DiskImage.h"
|
||||||
|
|
||||||
struct TimerMicroSeconds
|
struct TimerMicroSeconds
|
||||||
{
|
{
|
||||||
|
@ -73,7 +74,7 @@ public:
|
||||||
u8 GetDeviceId() { return deviceID; }
|
u8 GetDeviceId() { return deviceID; }
|
||||||
|
|
||||||
void SetLowercaseBrowseModeFilenames(bool value) { lowercaseBrowseModeFilenames = value; }
|
void SetLowercaseBrowseModeFilenames(bool value) { lowercaseBrowseModeFilenames = value; }
|
||||||
|
void SetNewDiskType(DiskImage::DiskType type) { newDiskType = type; }
|
||||||
void SetAutoBootFB128(bool autoBootFB128) { this->autoBootFB128 = autoBootFB128; }
|
void SetAutoBootFB128(bool autoBootFB128) { this->autoBootFB128 = autoBootFB128; }
|
||||||
void Set128BootSectorName(const char* SectorName)
|
void Set128BootSectorName(const char* SectorName)
|
||||||
{
|
{
|
||||||
|
@ -91,7 +92,7 @@ public:
|
||||||
const FILINFO* GetImageSelected() const { return &filInfoSelectedImage; }
|
const FILINFO* GetImageSelected() const { return &filInfoSelectedImage; }
|
||||||
void SetStarFileName(const char* fileName) { starFileName = fileName; }
|
void SetStarFileName(const char* fileName) { starFileName = fileName; }
|
||||||
|
|
||||||
int CreateD64(char* filenameNew, char* ID, bool automount);
|
int CreateNewDisk(char* filenameNew, char* ID, bool automount);
|
||||||
|
|
||||||
void SetDisplayingDevices(bool displayingDevices) { this->displayingDevices = displayingDevices; }
|
void SetDisplayingDevices(bool displayingDevices) { this->displayingDevices = displayingDevices; }
|
||||||
|
|
||||||
|
@ -194,6 +195,7 @@ protected:
|
||||||
|
|
||||||
bool displayingDevices;
|
bool displayingDevices;
|
||||||
bool lowercaseBrowseModeFilenames;
|
bool lowercaseBrowseModeFilenames;
|
||||||
|
DiskImage::DiskType newDiskType;
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
20
src/main.cpp
20
src/main.cpp
|
@ -1637,6 +1637,26 @@ void UpdateFirmwareToSD()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DisplayMessage(int x, int y, bool LCD, const char* message, u32 textColour, u32 backgroundColour)
|
||||||
|
{
|
||||||
|
char buffer[256] = { 0 };
|
||||||
|
|
||||||
|
if (!LCD)
|
||||||
|
{
|
||||||
|
x = screen.ScaleX(x);
|
||||||
|
y = screen.ScaleY(y);
|
||||||
|
|
||||||
|
screen.PrintText(false, x, y, (char*)message, textColour, backgroundColour);
|
||||||
|
}
|
||||||
|
else if (screenLCD)
|
||||||
|
{
|
||||||
|
RGBA BkColour = RGBA(0, 0, 0, 0xFF);
|
||||||
|
screenLCD->Clear(BkColour);
|
||||||
|
screenLCD->PrintText(false, x, y, (char*)message, textColour, backgroundColour);
|
||||||
|
screenLCD->SwapBuffers();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
extern "C"
|
extern "C"
|
||||||
{
|
{
|
||||||
void kernel_main(unsigned int r0, unsigned int r1, unsigned int atags)
|
void kernel_main(unsigned int r0, unsigned int r1, unsigned int atags)
|
||||||
|
|
Loading…
Reference in a new issue