Improve virtual cart eject / insert handling

This commit is contained in:
d0k3 2017-01-17 23:24:25 +01:00
parent 0379ba2cd5
commit ae2adbceea
5 changed files with 16 additions and 13 deletions

View File

@ -52,12 +52,6 @@ u32 GetCartName(char* name, CartData* cdata) {
} else return 1; } else return 1;
} }
u32 CheckCartId(u32 cart_id) {
if (!CART_INSERTED) return 0xFFFFFFFF;
u32 curr_cart_id = Cart_GetID();
return (curr_cart_id == cart_id) ? 0 : curr_cart_id;
}
u32 InitCardRead(CartData* cdata) { u32 InitCardRead(CartData* cdata) {
memset(cdata, 0x00, sizeof(CartData)); memset(cdata, 0x00, sizeof(CartData));
cdata->cart_type = CART_NONE; cdata->cart_type = CART_NONE;

View File

@ -21,7 +21,6 @@ typedef struct {
} __attribute__((packed)) CartData; } __attribute__((packed)) CartData;
u32 GetCartName(char* name, CartData* cdata); u32 GetCartName(char* name, CartData* cdata);
u32 CheckCartId(u32 cart_id);
u32 InitCardRead(CartData* cdata); u32 InitCardRead(CartData* cdata);
u32 ReadCartSectors(u8* buffer, u32 sector, u32 count, CartData* cdata); u32 ReadCartSectors(u8* buffer, u32 sector, u32 count, CartData* cdata);
u32 ReadCartBytes(u8* buffer, u32 offset, u32 count, CartData* cdata); u32 ReadCartBytes(u8* buffer, u32 offset, u32 count, CartData* cdata);

View File

@ -11,6 +11,7 @@
#include "platform.h" #include "platform.h"
#include "nand.h" #include "nand.h"
#include "virtual.h" #include "virtual.h"
#include "vcart.h"
#include "image.h" #include "image.h"
#define N_PANES 2 #define N_PANES 2
@ -1160,8 +1161,11 @@ u32 GodMode() {
InitExtFS(); InitExtFS();
} }
} }
} else if ((pad_state & (CART_INSERT|CART_EJECT)) && (curr_drvtype & DRV_CART)) { } else if (pad_state & (CART_INSERT|CART_EJECT)) {
GetDirContents(current_dir, current_path); // refresh cart dir contents if (!InitVCartDrive() && (pad_state & CART_INSERT)) // reinit virtual cart drive
ShowPrompt(false, "Cart init failed!");
if (!(*current_path) || (curr_drvtype & DRV_CART))
GetDirContents(current_dir, current_path); // refresh dir contents
} }
} }

View File

@ -4,14 +4,19 @@
#define VFLAG_PRIV_HDR (1<<31) #define VFLAG_PRIV_HDR (1<<31)
static CartData* cdata = (CartData*) VCART_BUFFER; // 128kB reserved (~64kB required) static CartData* cdata = (CartData*) VCART_BUFFER; // 128kB reserved (~64kB required)
static bool cart_init = false;
u32 InitVCartDrive(void) {
cart_init = (InitCardRead(cdata) == 0);
return cart_init ? cdata->cart_id : 0;
}
bool ReadVCartDir(VirtualFile* vfile, VirtualDir* vdir) { bool ReadVCartDir(VirtualFile* vfile, VirtualDir* vdir) {
if ((vdir->index < 0) && if ((vdir->index < 0) && !cart_init)
(CheckCartId(cdata->cart_id) != 0) && InitVCartDrive();
(InitCardRead(cdata) != 0))
return false;
if (++vdir->index < 3) { if (++vdir->index < 3) {
if (!cart_init) return false;
char name[24]; char name[24];
GetCartName(name, cdata); GetCartName(name, cdata);
memset(vfile, 0, sizeof(VirtualFile)); memset(vfile, 0, sizeof(VirtualFile));

View File

@ -3,6 +3,7 @@
#include "common.h" #include "common.h"
#include "virtual.h" #include "virtual.h"
u32 InitVCartDrive(void);
bool ReadVCartDir(VirtualFile* vfile, VirtualDir* vdir); bool ReadVCartDir(VirtualFile* vfile, VirtualDir* vdir);
int ReadVCartFile(const VirtualFile* vfile, u8* buffer, u32 offset, u32 count); int ReadVCartFile(const VirtualFile* vfile, u8* buffer, u32 offset, u32 count);
// int WriteVCartFile(const VirtualFile* vfile, const u8* buffer, u32 offset, u32 count); // no writes // int WriteVCartFile(const VirtualFile* vfile, const u8* buffer, u32 offset, u32 count); // no writes