From ae2adbceeaa163482c28b5e9d4ee92f5ea33e752 Mon Sep 17 00:00:00 2001 From: d0k3 Date: Tue, 17 Jan 2017 23:24:25 +0100 Subject: [PATCH] Improve virtual cart eject / insert handling --- source/gamecart/gamecart.c | 6 ------ source/gamecart/gamecart.h | 1 - source/godmode.c | 8 ++++++-- source/virtual/vcart.c | 13 +++++++++---- source/virtual/vcart.h | 1 + 5 files changed, 16 insertions(+), 13 deletions(-) diff --git a/source/gamecart/gamecart.c b/source/gamecart/gamecart.c index ced8a83..7df3b63 100644 --- a/source/gamecart/gamecart.c +++ b/source/gamecart/gamecart.c @@ -52,12 +52,6 @@ u32 GetCartName(char* name, CartData* cdata) { } 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) { memset(cdata, 0x00, sizeof(CartData)); cdata->cart_type = CART_NONE; diff --git a/source/gamecart/gamecart.h b/source/gamecart/gamecart.h index 487d92e..653bbb9 100644 --- a/source/gamecart/gamecart.h +++ b/source/gamecart/gamecart.h @@ -21,7 +21,6 @@ typedef struct { } __attribute__((packed)) CartData; u32 GetCartName(char* name, CartData* cdata); -u32 CheckCartId(u32 cart_id); u32 InitCardRead(CartData* cdata); u32 ReadCartSectors(u8* buffer, u32 sector, u32 count, CartData* cdata); u32 ReadCartBytes(u8* buffer, u32 offset, u32 count, CartData* cdata); diff --git a/source/godmode.c b/source/godmode.c index c4d8c82..addb51c 100644 --- a/source/godmode.c +++ b/source/godmode.c @@ -11,6 +11,7 @@ #include "platform.h" #include "nand.h" #include "virtual.h" +#include "vcart.h" #include "image.h" #define N_PANES 2 @@ -1160,8 +1161,11 @@ u32 GodMode() { InitExtFS(); } } - } else if ((pad_state & (CART_INSERT|CART_EJECT)) && (curr_drvtype & DRV_CART)) { - GetDirContents(current_dir, current_path); // refresh cart dir contents + } else if (pad_state & (CART_INSERT|CART_EJECT)) { + 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 } } diff --git a/source/virtual/vcart.c b/source/virtual/vcart.c index b179f80..1a7f814 100644 --- a/source/virtual/vcart.c +++ b/source/virtual/vcart.c @@ -4,14 +4,19 @@ #define VFLAG_PRIV_HDR (1<<31) 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) { - if ((vdir->index < 0) && - (CheckCartId(cdata->cart_id) != 0) && - (InitCardRead(cdata) != 0)) - return false; + if ((vdir->index < 0) && !cart_init) + InitVCartDrive(); if (++vdir->index < 3) { + if (!cart_init) return false; char name[24]; GetCartName(name, cdata); memset(vfile, 0, sizeof(VirtualFile)); diff --git a/source/virtual/vcart.h b/source/virtual/vcart.h index 93f6880..d9a9012 100644 --- a/source/virtual/vcart.h +++ b/source/virtual/vcart.h @@ -3,6 +3,7 @@ #include "common.h" #include "virtual.h" +u32 InitVCartDrive(void); bool ReadVCartDir(VirtualFile* vfile, VirtualDir* vdir); 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